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


当前回答

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

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

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

但这行不通:

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

其他回答

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)

你有多种选择。以下是两种选择。

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

当然,这是一个特定于boolean的答案。更一般地,可以使用numpy.count_nonzero。

>>> np.count_nonzero(boolarr)
5

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

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

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

但这行不通:

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

对于1D数组,这对我来说是有效的:

import numpy as np
numbers= np.array([3, 1, 5, 2, 5, 1, 1, 5, 1, 4, 2, 1, 4, 5, 3, 4, 
                  5, 2, 4, 2, 6, 6, 3, 6, 2, 3, 5, 6, 5])

numbersGreaterThan2= np.count_nonzero(numbers> 2)

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