用于计算满足条件的元素数量的 Numpy 掩码

Posted

技术标签:

【中文标题】用于计算满足条件的元素数量的 Numpy 掩码【英文标题】:Numpy mask to count number of elements satisfying a condition 【发布时间】: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) 给出计数,但它没有。请有任何建议。

【问题讨论】:

【参考方案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 的两个阶段结合在一起真是太好了。感谢您的精彩回答!

以上是关于用于计算满足条件的元素数量的 Numpy 掩码的主要内容,如果未能解决你的问题,请参考以下文章

英特尔 MKL 或一些类似的库是不是提供了一种矢量化方式来计算数组中满足 C 中某些条件的元素数量?

python基于组合逻辑判断替换numpy数组中的满足条件的元素相等判断替换numpy数组中的指定数值为另一个数值大小判断替换numpy数组中大于指定阈值的数值为另一个值

如果条件不满足,则保留最后一个值的 if/elif/else 的 Numpy 等效项

Numpy的广播机制详解(broadcasting)

仅当满足每行元素的条件时,才计算二维数组特定列的均值和方差

排除满足特定条件的元素的查询