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

nor*_*rio 162 python arrays boolean numpy count

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

Dav*_*ber 236

你有多种选择.以下两个选项.

numpy.sum(boolarr)
numpy.count_nonzero(boolarr)
Run Code Online (Sandbox Code Playgroud)

这是一个例子:

>>> 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
Run Code Online (Sandbox Code Playgroud)

当然,这是一个bool特定的答案.更一般地说,你可以使用numpy.count_nonzero.

>>> np.count_nonzero(boolarr)
5
Run Code Online (Sandbox Code Playgroud)

  • 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)"` (18认同)
  • @norio关于`bool`:在算术运算中,布尔值被视为1和0.请参阅Python标准库文档中的"[布尔值](http://docs.python.org/library/stdtypes.html#boolean-values)".请注意,NumPy的`bool`和Python`bool`不一样,但它们是兼容的(参见[here](http://docs.scipy.org/doc/numpy/reference/arrays.scalars.html#built-标量类型)以获取更多信息). (4认同)
  • @chbrown你是对的.但你应该比较`np.sum(bools)`!然而,`np.count_nonzero(bools)`仍然快〜12倍. (3认同)
  • 谢谢,大卫.他们看起来整洁.关于sum(..)的方法,在python中,True总是等于1(或者至少在numpy中)?如果不能保证,我会事先添加一个"if = = 1:"的支票.关于count_nonzero(..),不幸的是,它似乎没有在我的numpy模块1.5.1版本中实现,但我可能有机会在将来使用它. (2认同)

Gui*_*dre 29

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

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

>>> sum([True,True,True,False,False])
3
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

>>> sum([[False, False, True], [True, False, True]])
TypeError...
Run Code Online (Sandbox Code Playgroud)

也许这会对某人有所帮助.

  • 您应该首先“展平”数组的数组。不幸的是,没有内置方法,请参阅http://stackoverflow.com/questions/2158395/flatten-an-irregular-list-of-lists-in-python (2认同)
  • 谢谢Guillaume!也适用于Pandas数据帧. (2认同)

sal*_*jad 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])
Run Code Online (Sandbox Code Playgroud)

可以扩展到 D 维。

结果是:

预言:

[[1 2]
 [2 0]
 [2 0]
 [1 2]
 [1 2]]
Run Code Online (Sandbox Code Playgroud)

目标:

[[0 1]
 [1 0]
 [2 0]
 [0 0]
 [2 1]]
Run Code Online (Sandbox Code Playgroud)

D=1 的正确预测数: 1

D=2 的正确预测数: 2