如何使用Numpy高效统计指定范围内所有整数的出现频次?
Numpy统计指定整数范围元素频次的实现方案
我们可以直接用Numpy内置的np.bincount()方法实现需求,它是专门用于统计非负整数数组频次的原生接口,时间复杂度为O(n),比np.unique的实现效率更高,也不需要手动补全缺失值。
实现代码
import numpy as np def count(ar, from_val, to_val): # from是Python保留关键字,因此参数名用from_val替代 # 统计从0到数组最大值的所有整数出现频次 full_counts = np.bincount(np.asarray(ar)) # 初始化指定长度的结果数组,默认填充0 res = np.zeros(to_val - from_val, dtype=full_counts.dtype) # 计算有效计数的上下界 start = max(from_val, 0) end = min(to_val, len(full_counts)) # 将有效计数赋值到结果数组对应位置 if end > start: res[start - from_val : end - from_val] = full_counts[start:end] return res.tolist()
调用测试
对应示例的调用代码如下:
count(ar=[1, 3, 0, 3, 1, 1], from_val=0, to_val=4)
返回结果为[1, 3, 0, 2],完全符合预期。
拓展场景
如果需要统计的范围包含负数,只需要先对数组做偏移处理,把所有元素平移到非负区间再统计即可。比如要统计-2到3的频次,就给数组所有元素加2,将数值范围映射到0到5,再走上述逻辑即可。
内容的提问来源于stack exchange,提问作者MWB
相关产品推荐
相关产品推荐

