目录
1. 仅统计数组的值出现次数
2. 统计数组的值出现次数,并将没出现的值记为0
3. 对于非负整数值的统计,效率更高的一种方法 np.bincount()
输入数组x需要是非负整数,且是一维数组。
解释一下权重weights,以及最小bin的数量minlength。
np.bincount()总结
np.bincount()举例
import numpy as np
from collections import Counter
data = np.array([1.1,1.1,1.1,2,3,5,4,4,4,5])
# 方法一
print('Counter(data)\n',Counter(data)) # 调用Counter函数
print('==========')
# 方法二
print('np.unique(data)\n',np.unique(data)) # unique返回的是已排序数组
for i in np.unique(data):
print(np.sum(data==i)) # 对照unique数组,依次统计每个元素出现的次数
## np.unique(data,return_counts=True) 能直接返回unique的结果,也能返回统计结果
## 效果:(array([1.1, 2. , 3. , 4. , 5. ]), array([3, 1, 1, 3, 2], dtype=int64))
for i in range(6):
print('i = ',i)
print(np.sum(data==i))
其中,range(6)可以换成你任意需要的元素列表。这样,就可以看到每个元素出现的直观情况。
对于类似range(6)这样的统计需求,使用以下函数,效率会更高。
np.bincount(x, weights=None, minlength=0)
摘录官网的解释:关于 numpy.bincount() 官方文档的解释
更通俗地讲:
首先
The input array needs to be of integer dtype, otherwise a TypeError is raised.
ValueError
If the input is not 1-dimensional, or contains elements with negative values, or if minlength is negative.
TypeError
If the type of the input is float or complex.
其次
若不指定权重,则默认x每个位置上的权重相等且为1。若给定不同位置的权重,则返回加权和。
若不规定最小bin的个数,则默认的个数为(x的最大值+1)。比如最大值是2,则bin的个数为3,即[0 1 2]。
若规定bin的个数(需大于默认值否则无效),则bin的个数等于设定值。比如np.bincount(np.array([3,1,9]), minlength=8),若不指定minlength,输出的个数应该为9+1=10个。但此时指定的minlength小于10,小于默认状态下的数量,参数不再作用。返回的长度仍为10。如果np.bincount(np.array([3,1,9]), minlength=20),指定的minlength大于10,那么返回的长度就是20。
返回值中的每个bin,给出了它的索引值在x中出现的次数(在默认权重下)。
返回值中的每个bin,给出了它的索引值,由于在x中出现在不同位置所导致权重不同,而计算的加权和。
其中,索引的长度可由minlength规定。
>>> np.bincount(np.arange(5))
array([1, 1, 1, 1, 1])
>>> np.bincount(np.array([0, 1, 1, 3, 2, 1, 7]))
array([1, 3, 1, 1, 0, 0, 0, 1])
>>> x = np.array([0, 1, 1, 3, 2, 1, 7, 23])
>>> np.bincount(x).size == np.amax(x)+1
True