如何计算NumPy bool数组中真实元素的数量


Answers:


261

您有多种选择。以下是两个选项。

numpy.sum(boolarr)
numpy.count_nonzero(boolarr)

这是一个例子:

>>> import numpy as np
>>> boolarr = np.array([[0, 0, 1], [1, 0, 1], [1, 0, 1]], dtype=np.bool)
>>> boolarr
array([[False, False,  True],
       [ True, False,  True],
       [ True, False,  True]], dtype=bool)

>>> np.sum(boolarr)
5

当然,这是一个bool特定的答案。通常,您可以使用numpy.count_nonzero

>>> np.count_nonzero(boolarr)
5

2
谢谢大卫。他们看起来很整洁。关于带有sum(..)的方法,在python中(或至少在numpy中)True是否始终等于1?如果不能保证,我将事先添加一个检查,如果True == 1 :。不幸的是,关于count_nonzero(..),它似乎没有在1.5.1版的numpy模块中实现,但是将来我可能有机会使用它。
norio

4
@norio关于bool:布尔值在算术运算中被视为1和0。请参阅Python标准库文档中的“ 布尔值 ”。请注意,NumPy bool和Python bool不同,但是它们是兼容的(有关更多信息,请参见此处)。
David Alber

1
@norio关于numpy.count_nonzero不在NumPy v1.5.1中:您是对的。根据此发行公告,它已在NumPy v1.6.0中添加。
David Alber

25
FWIW,numpy.count_nonzero至少在我的Python解释器中快了大约一千倍。 python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "np.count_nonzero(bools)"vs.python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "sum(bools)"
chbrown

6
@chbrown你是对的。但是您应该比较一下np.sum(bools)!但是,np.count_nonzero(bools)仍然快12倍左右。
2015年

29

这个问题为我解决了一个非常类似的问题,我认为我应该分享:

在原料Python中,你可以使用sum()计算True的值list

>>> sum([True,True,True,False,False])
3

但这不起作用:

>>> sum([[False, False, True], [True, False, True]])
TypeError...

您应该先“拉平”阵列的阵列。不幸的是,没有内置的方法,请参阅stackoverflow.com/questions/2158395/...
托米chheng

2
谢谢纪尧姆!也可以与Pandas数据框一起使用。
JJFord3'1

4

在比较两个numpy数组并计算匹配数(例如机器学习中正确的类预测)方面,我发现以下两个维度的示例很有用:

import numpy as np
result = np.random.randint(3,size=(5,2)) # 5x2 random integer array
target = np.random.randint(3,size=(5,2)) # 5x2 random integer array

res = np.equal(result,target)
print result
print target
print np.sum(res[:,0])
print np.sum(res[:,1])

可以扩展到D尺寸。

结果是:

预测:

[[1 2]
 [2 0]
 [2 0]
 [1 2]
 [1 2]]

目标:

[[0 1]
 [1 0]
 [2 0]
 [0 0]
 [2 1]]

D = 1的正确预测计数: 1

D = 2的正确预测计数: 2


3

如果您希望按行进行计数,请提供axis=1sum

boolarr
# array([[False, False,  True],
#        [ True, False,  True],
#        [ True, False,  True]], dtype=bool)

boolarr.sum(axis=1)
# array([1, 2, 2])

同样,使用np.count_nonzero

np.count_nonzero(boolarr, axis=1)
# array([1, 2, 2])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.