You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按列统计二维数组中每个唯一元素的出现次数?

按列统计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:02:20