numpy 统计数组的值出现次数与np.bincount()详细解释

目录

1.  仅统计数组的值出现次数

2. 统计数组的值出现次数,并将没出现的值记为0

3. 对于非负整数值的统计,效率更高的一种方法 np.bincount()

输入数组x需要是非负整数,且是一维数组。

解释一下权重weights,以及最小bin的数量minlength。

np.bincount()总结

np.bincount()举例



1.  仅统计数组的值出现次数

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))

2. 统计数组的值出现次数,并将没出现的值记为0

for i in range(6):
	print('i = ',i)
	print(np.sum(data==i))

其中,range(6)可以换成你任意需要的元素列表。这样,就可以看到每个元素出现的直观情况。

3. 对于非负整数值的统计,效率更高的一种方法 np.bincount()

对于类似range(6)这样的统计需求,使用以下函数,效率会更高。

np.bincount(x, weights=None, minlength=0)

摘录官网的解释:关于 numpy.bincount() 官方文档的解释 

更通俗地讲:

首先

输入数组x需要是非负整数,且是一维数组。

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.

 

 其次

解释一下权重weights,以及最小bin的数量minlength。

若不指定权重,则默认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。

np.bincount()总结

返回值中的每个bin,给出了它的索引值在x中出现的次数(在默认权重下)。

返回值中的每个bin,给出了它的索引值,由于在x中出现在不同位置所导致权重不同,而计算的加权和。

其中,索引的长度可由minlength规定。

np.bincount()举例

>>> 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
 
  • 30
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值