【问题标题】:Numpy mask to count number of elements satisfying a condition用于计算满足条件的元素数量的 Numpy 掩码
【发布时间】:2018-09-20 13:53:43
【问题描述】:

如何使用 Numpy 将这个 for 循环向量化?

count=0
arr1 = np.random.rand(184,184)
for i in range(arr1.size[0]):
    for j in range(arr1.size[1]):
        if arr1[i,j] > 0.6:
            count += 1
print count

我试过了:

count=0
arr1 = np.random.rand(184,184)
mask = (arr1>0.6)
indices = np.where(mask)
print indices , len(indices) 

我希望 len(indices) 给出计数,但它没有。请有任何建议。

【问题讨论】:

    标签: python arrays numpy vectorization


    【解决方案1】:

    您也可以使用 Numpy 数组的 size 属性:

    arr1 = np.random.rand(184,184)
    
    arr1[ arr1 > 0.6 ].size
    

    【讨论】:

      【解决方案2】:

      np.count_nonzero 应该比总和快一点:

      np.count_nonzero(arr1 > 0.6)
      

      其实快三倍

      >>> from timeit import repeat
      >>> kwds = dict(globals=globals(), number=10000)
      >>> 
      >>> arr1 = np.random.rand(184,184)
      >>> 
      >>> repeat('np.count_nonzero(arr1 > 0.6)', **kwds)
      [0.15281831508036703, 0.1485864429268986, 0.1477385900216177]
      >>> repeat('(arr1 > 0.6).sum()', **kwds)
      [0.5286932559683919, 0.5260644309455529, 0.5260107989888638]
      

      【讨论】:

        【解决方案3】:

        获取一个布尔掩码并计算“真”:

        (arr1 > 0.6).sum()
        

        【讨论】:

        • 这是一个如此紧凑和简单的解决方案,展示了 numpy 的真正力量。将 where 和 count 的两个阶段结合在一起真是太好了。感谢您的精彩回答!
        猜你喜欢
        • 2019-11-14
        • 2018-07-26
        • 2021-02-05
        • 2018-04-25
        • 2012-01-14
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多