NumPy中如何根据一个数组分组计算另一数组对应元素平均值
NumPy按分组键计算对应数组均值的实现方案
针对根据X数组取值对Y数组元素分组求均值的需求,提供两种可直接运行的实现方式:
方法1:纯NumPy实现(无额外依赖)
易读版本(适合中小数据量)
逻辑直观,通过布尔索引筛选每个分组的元素直接计算均值:
import numpy as np # 示例输入 X = np.array([1, 1, 2, 2, 2, 2, 3, 3]) Y = np.array([10, 30, 15, 10, 16, 10, 15, 20]) # 获取X的所有唯一分组值 unique_groups = np.unique(X) # 计算每个分组对应的Y均值,结果为字典格式,key是X的取值,value是对应均值 group_means = {group: Y[X == group].mean() for group in unique_groups}
运行结果和示例计算规则完全匹配:
- X=1对应均值:
20.0 - X=2对应均值:
12.75 - X=3对应均值:
17.5
如果需要数组格式输出,直接执行np.array(list(group_means.values()))即可,顺序和unique_groups一一对应。
高性能版本(适合百万级以上大数据量)
避免循环遍历,通过排序+分段聚合提升运行效率:
import numpy as np X = np.array([1, 1, 2, 2, 2, 2, 3, 3]) Y = np.array([10, 30, 15, 10, 16, 10, 15, 20]) # 按X排序保证同组元素连续 sort_index = np.argsort(X) X_sorted = X[sort_index] Y_sorted = Y[sort_index] # 定位每个分组的起始位置 split_pos = np.flatnonzero(np.r_[True, X_sorted[1:] != X_sorted[:-1]]) # 分段求和、计数后计算均值 group_sum = np.add.reduceat(Y_sorted, split_pos) group_count = np.diff(np.r_[split_pos, len(X_sorted)]) unique_groups = X_sorted[split_pos] group_means = group_sum / group_count
方法2:Pandas实现(代码最简洁)
如果日常数据处理已经使用pandas,直接调用分组聚合接口即可,不需要手动处理索引逻辑:
import numpy as np import pandas as pd X = np.array([1, 1, 2, 2, 2, 2, 3, 3]) Y = np.array([10, 30, 15, 10, 16, 10, 15, 20]) # 一行代码完成分组求均值,可按需转成字典、数组格式 group_means = pd.Series(Y).groupby(X).mean()
内容的提问来源于stack exchange,提问作者kyazgan
相关产品推荐
相关产品推荐

