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

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

你有多个选项。 两个选项如下。

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

当然,这是一个bool特异的答案。 更一般地说,你可以使用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... 

也许这会帮助别人。

如果你想做一个行计数,供应axis=1sum

 In [345]: boolarr Out[345]: array([[False, False, True], [ True, False, True], [ True, False, True]], dtype=bool) In [346]: boolarr.sum(axis=1) Out[346]: array([1, 2, 2]) 

同样,使用np.count_nonzero

 In [348]: np.count_nonzero(boolarr, axis=1) Out[348]: array([1, 2, 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的正确预测数