【问题标题】:Return True/False for entire array if any value meets mask requirement(s)如果任何值满足掩码要求,则为整个数组返回 True/False
【发布时间】:2020-03-06 21:28:36
【问题描述】:

我已经尝试查看其他类似的帖子,但是,他们的解决方案并不能解决这个特定问题。使用来自post 的答案,我发现我收到错误:“具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()”,因为我以不同方式定义数组从他们的。他们的数组是大小(n,),而我的数组是大小(n,m)。此外,这个post 的解决方案也不起作用,因为它适用于列表。我能想到的唯一方法是:

当数组中至少有 1 个 True 时,则认为整个数组为 True:

filt = 4
tracktruth = list()
arraytruth = list()
arr1 = np.array([[1,2,4]])
for track in range(0,arr1.size):
    if filt == arr1[0,track]:
        tracktruth.append(True)
    else:
        tracktruth.append(False)

if any(tracktruth):
    arraytruth.append(True)
else:
    arraytruth.append(False)

当数组中没有单个 True 时,则认为整个数组为 False:

filt = 5
tracktruth = list()
arraytruth = list()
arr1 = np.array([[1,2,4]])
for track in range(0,arr1.size):
    if filt == arr1[0,track]:
        tracktruth.append(True)
    else:
        tracktruth.append(False)

if any(tracktruth):
    arraytruth.append(True)
else:
    arraytruth.append(False)

存在第二个 if-else 语句的原因是因为我希望将此掩码应用于多个数组并最终创建一个主列表,该列表描述哪些数组是真的,哪些是假的。但是,对于一个 for 循环和两个 if-else 语句,我认为这对于较大的数组来说会非常慢。有什么更快的方法来做到这一点?

【问题讨论】:

  • 所以你只想检查值是否在嵌套数组中?
  • .any() 没有给你想要的结果的例子是什么?
  • @pierogi 为了清楚起见,我编辑了我的原始帖子。我想看看是否有任何值小于定义的数值。
  • @HeapOverflow 我编辑了原始帖子以显示两个实例。
  • 我仍然没有真正看到测试数据。我看到一堆代码(不清楚是否正确),但我并没有真正看到输入数据是什么,期望的输出数据是什么。

标签: python


【解决方案1】:

这似乎过于复杂,你可以使用布尔索引来实现不循环的结果

arr1=np.array([[1,2,4]])

filt=4

arr1==filt

array([[False, False,  True]])

np.sum(arr1==filt).astype(bool)

True

如果n多于一行,您可以使用np.sum中的行或列索引,也可以使用axis参数对行或列求和

正如 cmets 中所指出的,您可以使用 np.any() 而不是 np.sum(...).astype(bool),它在测试数据集上的运行时间大约是 2/3:

np.any(a==filt, axis=1)

array([ True])

【讨论】:

  • 很简单很酷的方法。几乎只需要两行。我不知道可以这样添加逻辑。
  • 操作向量化确实是 numpy 的亮点。虽然有 一些 情况需要在 numpy 中循环,但它们确实比常规情况更多。干杯!
  • 这和(arr1 == filt).any()有区别吗?
  • 好电话,已编辑。我使用 np.any() 而不是 array.any() 来匹配我的其余答案,但同样的原则适用
【解决方案2】:

您可以通过列表理解来做到这一点。我在这里为一个数组完成了它,但它很容易通过 for 循环扩展到多个数组

filt = 4
arr1 = np.array([[1,2,4]])
print(any([part == filt for part in arr1[0]]))

【讨论】:

    【解决方案3】:

    您可以更一般地获取arraytruth,对大小为 (n,m) 的数组进行列表理解

    import numpy as np
    
    filt = 4
    a = np.array([[1, 2, 4]])
    b = np.array([[1, 2, 3],
                  [5, 6, 7]])
    
    array_lists = [a, b]
    
    arraytruth = [True if a[a==filt].size>0 else False for a in array_lists]
    
    print(arraytruth)
    

    这会给你:

    [True, False]
    

    【讨论】:

      【解决方案4】:

      [编辑] 使用 numpy hstack 方法。

      filt = 4
      arr = np.array([[1,2,3,4], [1,2,3]])
      
      print(any([x for x in np.hstack(arr) if x < filt]))
      

      【讨论】:

        猜你喜欢
        • 2020-11-08
        • 2021-01-15
        • 2010-11-13
        • 2022-01-17
        • 2019-09-01
        • 1970-01-01
        • 2018-01-04
        • 2021-04-22
        • 1970-01-01
        相关资源
        最近更新 更多