python统计元素出现次数(accumarray实现)

引言

 本文介绍了利用python中的numpy模块构建二维的频次矩阵,对应于matlab中的accummarrary()函数,matlab官方文档对于accumarray()的介绍是:

B = accumarray(ind,data,sz) 根据 ind 中指定的组,通过对向量 data 的元素进行累加来对组数据求和。然后计算每组的总和,返回填充到 sz 大小的数组 B。ind 中的值定义数据所属的组以及存储每个组总和的输出数组 B 的索引。

也就是给出索引ind,以及对应索引上的data值,将同一索引对应data的值累加,以此作为B中ind对应位置的值 B ( i , j ) = ∑ d a t a [ i n d ] B(i,j)=\sum data[ind] B(i,j)=data[ind]。如果data设为全1,就可以认为ind为元素的出现表(一维二维皆可),返回矩阵统计了不同元素的出现次数 B ( i , j ) = ∑ # ( i n d )   w h e n   d a t a = e e T B(i,j)=\sum\#(ind)\ when\ data=ee^T B(i,j)=#(ind) when data=eeT,也就是频次矩阵。
 目前python中比较常用的统计元素出现次数的方法为np.bincout(),但它局限于一维正数组;如果使用list的count()方法,又需要引入循环对每个不同元素计算出现次数,且要手动往频次矩阵填值;

解决方案

 如下给出两种方案来统计数组中元素出现数,并构建相应频次矩阵。

numpy方法

 对于二维数组使用unique()方法获得不同元素和它们出现次数,再直接向频次矩阵里填充值。代码如下:

data=np.random.randint(5,size=(2,6))
ind,times=np.unique(data,return_counts=True,axis=1)
freq=np.zeros((data.max()+1,data.max()+1))
freq[ind[0],ind[1]]=times

结果如下:

data
Out[21]: 
array([[4, 0, 4, 3, 1, 4],
       [3, 4, 0, 3, 2, 3]])
freq
Out[22]: 
array([[0., 0., 0., 0., 1.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 1., 0.],
       [1., 0., 0., 2., 0.]])

同理该方法可拓展至一维数组和非正整数组。

pandas方法

 pandas方法利用value_count()统计元素出现次数。

data=np.random.randint(5,size=(2,6))
freq=np.zeros((data.max()+1,data.max()+1))
data=pd.DataFrame(data.T)
times=data.value_counts()
ind=times.index.to_list()
ind=np.array(ind).T
times=times.to_numpy()
freq[ind]=times

结果如下:

data
Out[53]: 
   0  1
0  2  1
1  4  4
2  4  1
3  2  3
4  4  4
5  1  0
freq
Out[54]: 
array([[0., 0., 0., 0., 0.],
       [1., 0., 0., 0., 0.],
       [0., 1., 0., 1., 0.],
       [0., 0., 0., 0., 0.],
       [0., 1., 0., 0., 2.]])

总结

 本文利用python实现了matlab中的accumarray(),填补了网络上二维频次矩阵构建方法的空白。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 可以使用Python中的Counter模块来统计元素出现次数。具体步骤如下: 1. 首先,生成1000个0到100之间的随机整数,可以使用random模块中的randint函数来实现。 2. 然后,将这1000个随机整数放入一个列表中。 3. 接着,使用Counter模块来统计列表中每个元素出现次数,可以使用most_common函数来获取出现次数最多的元素及其出现次数。 下面是示例代码: ```python import random from collections import Counter # 生成1000个0到100之间的随机整数 nums = [random.randint(0, 100) for _ in range(1000)] # 统计每个元素出现次数 counter = Counter(nums) # 获取出现次数最多的元素及其出现次数 most_common = counter.most_common(1) print("出现次数最多的元素是:{},出现了{}次。".format(most_common[0][0], most_common[0][1])) ``` 输出结果可能如下: ``` 出现次数最多的元素是:55,出现了23次。 ``` ### 回答2: ### 回答3: 我们可以使用Python语言来统计1000个0到100的元素出现次数。具体步骤如下: 1. 首先,我们需要生成1000个0到100的随机整数,可以使用Python中的random模块来实现。代码如下: ```python import random nums = [random.randint(0, 100) for _ in range(1000)] ``` 上述代码中,我们通过列表推导式生成了1000个随机整数,每个整数的范围是0到100之间。 2. 接下来,我们可以使用Python中的collections模块中的Counter类来对这1000个随机整数进行计数。具体来说,我们可以将这1000个整数存放到一个Counter对象中,然后调用Counter对象的most_common()方法来获取出现次数最多的元素及其出现次数。代码如下: ```python from collections import Counter counter = Counter(nums) most_common = counter.most_common(1) print("出现次数最多的元素是{},出现了{}次".format(most_common[0][0], most_common[0][1])) ``` 上述代码中,我们首先使用Counter类对nums列表中的元素进行计数,并将结果保存到counter变量中。接着,我们调用counter对象的most_common()方法,来获取出现次数最多的元素及其出现次数,然后通过格式化字符串来输出结果。 注意,在这里,我们使用most_common()方法的参数设置为1,这是因为我们只需要获取出现次数最多的一个元素,如果需要获取出现次数最多的前n个元素,则可以将参数设置为n。 最终,运行上述代码,我们就可以得到1000个随机整数中出现次数最多的元素及其出现次数,从而完成了统计元素出现次数的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值