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

14
如何使用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)会给出数量,但实际上它没有。请问有什么建议吗。

3个回答

31

获取一个布尔掩码,然后只计算“True”的数量:

(arr1 > 0.6).sum()

1
这是一个非常简洁和简单的解决方案,展示了numpy的真正威力。很棒的是where和count两个阶段被结合在一起。感谢您提供如此出色的答案! - msarafzadeh

27

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

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

arr1 = np.random.rand(184,184)

arr1[ arr1 > 0.6 ].size

令人惊讶的是,访问此属性比np.count_nonzero慢一个数量级,但我找不到任何解释原因的说明。 - bsplosion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接