NumPy中如何实现类似pandas groupBy的矩阵元素分组计数
NumPy实现类groupby分组计数方案
NumPy 原生即可实现类似pandas groupby的分组统计功能,不需要额外引入pandas就能完成按列分组、统计元素出现次数的需求。
核心实现思路
- 将原始列表转换为NumPy数组格式
- 识别分组维度下的唯一值组合
- 统计每个唯一组合的出现次数
- 将计数结果作为新列拼接至去重后的矩阵,得到最终结果
版本1:快速实现(结果自动按值排序)
用np.unique直接完成去重+计数,代码最简洁,唯一值会默认按从小到大排序:
import numpy as np # 原始输入矩阵 matrix = np.array([[ 0., 143.], [ 0., 170.], [ 0., 143.], [ 1., 269.], [ 0., 170.], [ 1., 269.], [ 0., 155.], [ 1., 269.]]) # 按行识别唯一值组合,同时返回每个组合的出现次数 unique_pairs, counts = np.unique(matrix, axis=0, return_counts=True) # 拼接计数列得到结果 result = np.hstack([unique_pairs, counts.reshape(-1, 1)])
运行输出:
[[ 0. 143. 2.] [ 0. 155. 1.] [ 0. 170. 2.] [ 1. 269. 3.]]
版本2:保序实现(完全匹配期望输出顺序)
如果需要严格保留数值对首次出现的顺序,和你给出的期望输出顺序完全一致,可以通过索引排序实现:
import numpy as np matrix = np.array([[ 0., 143.], [ 0., 170.], [ 0., 143.], [ 1., 269.], [ 0., 170.], [ 1., 269.], [ 0., 155.], [ 1., 269.]]) # 识别所有唯一值对对应的首次出现索引 _, first_occur_idx = np.unique( matrix.view(','.join(['f8']*matrix.shape[1])), return_index=True ) # 按首次出现顺序排列索引,提取保序的唯一值对 sorted_idx = np.sort(first_occur_idx) unique_pairs = matrix[sorted_idx] # 统计每个值对的出现次数 counts = np.array([np.sum(np.all(matrix == row, axis=1)) for row in unique_pairs]) # 拼接得到最终结果 result = np.hstack([unique_pairs, counts.reshape(-1, 1)])
运行输出和给出的期望结果完全一致:
[[ 0. 143. 2.] [ 0. 170. 2.] [ 1. 269. 3.] [ 0. 155. 1.]]
内容的提问来源于stack exchange,提问作者Vallinox
相关产品推荐
相关产品推荐

