如何使用Numpy沿多轴统计元素出现次数?
基于Numpy实现沿行统计元素出现次数
需求说明
给定二维Numpy数组,需对每行统计各元素的出现次数,输出数组的列索引对应元素值,未出现的元素计数为0。
输入输出示例
输入数组:
import numpy as np arr = np.array([[1,2,3], [4,5,5]])
期望输出:
np.array([[0,1,1,1,0,0], [0,0,0,0,1,2]])
Numpy实现方法
方法1:结合apply_along_axis与bincount
代码简洁,适合中小规模数组:
max_val = arr.max() # 沿每行应用bincount,minlength确保覆盖所有可能的元素值 result = np.apply_along_axis(lambda x: np.bincount(x, minlength=max_val + 1), axis=1, arr=arr)
np.bincount用于统计非负整数的出现频次,minlength设为数组最大元素+1,保证输出列数覆盖所有可能的元素。np.apply_along_axis指定axis=1,对每行单独处理。
方法2:向量化高效实现(无显式循环)
处理大规模数组时优先用这种方法,避免apply_along_axis的底层循环开销:
max_val = arr.max() rows, cols = arr.shape # 将行索引展平,与元素值组合成唯一编码 row_indices = np.repeat(np.arange(rows), cols) flat_arr = arr.flatten() encoded = row_indices * (max_val + 1) + flat_arr # 统计编码后的频次,再重塑为目标形状 counts = np.bincount(encoded, minlength=rows * (max_val + 1)) result = counts.reshape(rows, max_val + 1)
- 通过编码将
(行号, 元素值)映射为唯一整数,用bincount一次性完成全局统计,再重塑为二维数组,效率远高于Python循环。
注意事项
如果数组包含负数,需要先对元素做偏移处理(比如加上最小绝对值),确保所有元素转为非负整数后再使用bincount。
内容的提问来源于stack exchange,提问作者Mason Wang
相关产品推荐
相关产品推荐

