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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:15:49