如何计算 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 数组中真实元素的数量的主要内容,如果未能解决你的问题,请参考以下文章
不用循环,python numpy 数组如何对每个元素进行操作?