Answers:
您有多种选择。以下是两个选项。
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
bool
:布尔值在算术运算中被视为1和0。请参阅Python标准库文档中的“ 布尔值 ”。请注意,NumPy bool
和Python bool
不同,但是它们是兼容的(有关更多信息,请参见此处)。
numpy.count_nonzero
不在NumPy v1.5.1中:您是对的。根据此发行公告,它已在NumPy v1.6.0中添加。
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)"
np.sum(bools)
!但是,np.count_nonzero(bools)
仍然快12倍左右。
这个问题为我解决了一个非常类似的问题,我认为我应该分享:
在原料Python中,你可以使用sum()
计算True
的值list
:
>>> sum([True,True,True,False,False])
3
但这不起作用:
>>> sum([[False, False, True], [True, False, True]])
TypeError...
在比较两个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