如何统计NumPy布尔数组中为真的元素数量

251 投票
6 回答
345870 浏览
提问于 2025-04-17 07:35

我有一个名为 'boolarr' 的 NumPy 布尔数组,里面的值要么是 True 要么是 False。我想统计一下里面有多少个值是 True。请问有没有专门的 NumPy 或 Python 方法可以做到这一点?还是说我需要在我的代码里一个一个地去数?

6 个回答

5

在比较两个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

34

这个问题帮我解决了一个很相似的问题,我觉得应该分享一下:

在纯Python中,你可以用 sum() 来计算一个 list 中有多少个 True 值:

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

但是这样做是行不通的:

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

你有很多选择。这里有两个选项。

boolarr.sum()
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)

>>> boolarr.sum()
5

当然,这个答案是针对bool类型的。更一般来说,你可以使用numpy.count_nonzero这个方法。

>>> np.count_nonzero(boolarr)
5

撰写回答