如何按列统计二维数组中每个唯一元素的出现次数?
按列统计NumPy二维数组中唯一值的出现次数
问题背景
给定如下NumPy二维数组:
import numpy as np a = np.array([[2,2,3,3], [2,3,3,3], [3,3,4,4]])
需要按列统计所有排序后唯一值的出现次数,预期结果为:
[[2,1,0,0], [1,2,2,2], [0,0,1,1]]
其中每一行对应一个唯一值(2、3、4),每一列是该值在原数组对应列的出现次数。
错误方法分析
你尝试的np.unique(a, return_counts=True, axis=0)无法满足需求,因为axis=0参数是按行去重,统计的是每一行在数组中出现的次数,所以得到的结果是原数组的三行各出现1次,和按列统计单个值次数的需求完全不匹配。
正确实现方法
方法一:广播比较法
利用NumPy的广播特性,直接将唯一值与原数组的每一列进行比较,再统计次数:
import numpy as np a = np.array([[2,2,3,3], [2,3,3,3], [3,3,4,4]]) # 获取排序后的全局唯一值 unique_vals = np.sort(np.unique(a)) # 广播比较:将唯一值扩展维度后与原数组逐元素比较,再按行求和得到每列的次数 result = (a == unique_vals[:, None, None]).sum(axis=1) print(result) # 输出: # [[2 1 0 0] # [1 2 2 2] # [0 0 1 1]]
原理:unique_vals[:, None, None]将一维的唯一值数组转换为三维形状(n,1,1),与原二维数组a(形状(3,4))广播后,得到形状(n,3,4)的布尔数组,其中n是唯一值的数量。对axis=1求和,就得到每个唯一值在每一列的出现次数。
方法二:结合np.bincount与列遍历
针对每一列使用np.bincount统计值的出现次数,再提取对应唯一值的结果:
import numpy as np a = np.array([[2,2,3,3], [2,3,3,3], [3,3,4,4]]) unique_vals = np.sort(np.unique(a)) # 获取值的范围,确保bincount能覆盖所有唯一值 min_val, max_val = unique_vals.min(), unique_vals.max() # 转置数组后遍历每一列(原数组的列),统计次数并提取唯一值对应结果 col_counts = [np.bincount(col, minlength=max_val+1)[unique_vals] for col in a.T] # 再转置得到最终结果 result = np.array(col_counts).T print(result) # 输出与方法一一致
原理:a.T将原数组转置,使得每一行对应原数组的一列;np.bincount统计列中每个值的出现次数,通过minlength确保数组长度覆盖所有可能的唯一值;最后提取唯一值对应的次数并转置,得到预期的行列结构。
内容的提问来源于stack exchange,提问作者zxdawn
相关产品推荐
相关产品推荐

