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

Posted

技术标签:

【中文标题】如何计算 NumPy bool 数组中真实元素的数量【英文标题】:How to count the number of true elements in a NumPy bool array 【发布时间】:2012-01-11 23:24:05 【问题描述】:

我有一个布尔类型的 NumPy 数组“boolarr”。我想计算值为True 的元素的数量。是否有专门用于此任务的 NumPy 或 Python 例程?或者,我是否需要遍历脚本中的元素?

【问题讨论】:

对于熊猫:***.com/questions/26053849/… 【参考方案1】:

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

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

【讨论】:

谢谢,大卫。它们看起来很整洁。关于 sum(..) 的方法,在 python 中 True 是否总是等于 1(或至少在 numpy 中)?如果不能保证,我会预先添加一个检查,'if True==1:'。关于count_nonzero(..),很遗憾,我1.5.1版本的numpy模块中似乎没有实现,但我以后可能有机会使用它。 @norio 关于bool:布尔值在算术运算中被视为 1 和 0。请参阅 Python 标准库文档中的“Boolean Values”。请注意,NumPy 的 bool 和 Python 的 bool 不一样,但它们是兼容的(更多信息请参阅 here)。 @norio 关于numpy.count_nonzero 不在 NumPy v1.5.1 中:你是对的。根据这个release announcement,它是在NumPy v1.6.0中添加的。 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)"python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "sum(bools)" @chbrown 你是对的。但是您应该与np.sum(bools) 进行比较!但是,np.count_nonzero(bools) 仍然快 12 倍左右。【参考方案2】:
b[b].size

b 是有问题的布尔 ndarray。它为True 过滤b,然后计算过滤后数组的长度。

这可能不如前面提到的np.count_nonzero() 高效,但如果您忘记了其他语法,它会很有用。此外,这种更短的语法可以节省程序员的时间。

演示:

In [1]: a = np.array([0,1,3])

In [2]: a
Out[2]: array([0, 1, 3])

In [3]: a[a>=1].size
Out[3]: 2

In [5]: b=a>=1

In [6]: b
Out[6]: array([False,  True,  True])

In [7]: b[b].size
Out[7]: 2

【讨论】:

【参考方案3】:
boolarr.sum(axis=1 or axis=0)

axis = 1 将输出一行中的真数,axis = 0 将计算列中的真数 所以

boolarr[[true,true,true],[false,false,true]]
print(boolarr.sum(axis=1))

将是 (3,1)

【讨论】:

【参考方案4】:

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

在原始 python 中,您可以使用 sum() 计算 list 中的 True 值:

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

但这行不通:

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

【讨论】:

您应该首先“展平”数组数组。不幸的是,没有内置方法,请参阅***.com/questions/2158395/… 感谢纪尧姆!也适用于 Pandas 数据框。【参考方案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

【讨论】:

以上是关于如何计算 NumPy bool 数组中真实元素的数量的主要内容,如果未能解决你的问题,请参考以下文章

有效地计算numpy数组中的零元素?

不用循环,python numpy 数组如何对每个元素进行操作?

python使用numpy中的equal函数比较两个numpy数组中每个位置的元素是否相同并计算相同元素的比例

二维数组的 Numpy 元素平均计算

如何使用 pybind 传递 numpy 数组列表

numpy 基础