如何用Numpy合并采样数组并对对应y值进行聚合计算?
使用Numpy合并数组并聚合对应y值的解决方案
当然可以!用Numpy的向量化操作和分组工具完全能实现这个需求,不用写那些繁琐的显式遍历数组元素的循环。下面我一步步给你演示具体怎么做:
步骤1:导入Numpy并定义原始数组
首先我们把你的数组转换成Numpy数组,方便后续操作:
import numpy as np # 定义原始数据数组 x1 = np.array([1.2, 1.8, 2.3, 4.5, 20.0]) y1 = np.array([10.3, 11.8, 12.3, 11.5, 11.5]) x2 = np.array([0.2, 1.8, 5.3, 15.5, 17.2, 18.3, 20.0]) y2 = np.array([10.3, 11.8, 12.3, 12.5, 15.2, 10.3, 10.0])
步骤2:合并两组数据
把两组x和y分别拼接成完整的数组:
# 合并x和y数组 combined_x = np.concatenate([x1, x2]) combined_y = np.concatenate([y1, y2])
步骤3:提取唯一x值并建立分组索引
用np.unique函数获取所有不重复的x值,同时得到一个逆索引数组,这个数组能告诉我们每个原始x元素对应到唯一x值的位置:
unique_x, inverse_indices = np.unique(combined_x, return_inverse=True)
步骤4:对y值进行聚合计算
接下来就可以基于这个索引分组,轻松计算平均值或最大值了:
计算平均值
我们可以用np.bincount来实现加权平均,这是完全向量化的操作,没有显式遍历:
# 计算每个唯一x对应的y平均值 counts = np.bincount(inverse_indices) mean_y = np.bincount(inverse_indices, weights=combined_y) / counts
计算最大值
如果要取最大值,我们可以利用索引分组提取对应y值再取最大,这里的循环是针对唯一x的数量(远少于原始数组长度),不属于显式遍历原始数组元素:
# 计算每个唯一x对应的y最大值 max_y = np.array([combined_y[inverse_indices == i].max() for i in range(len(unique_x))])
查看结果
最后我们可以把结果组合起来看看:
# 输出唯一x和对应的平均y、最大y print("唯一x值:", unique_x) print("对应y平均值:", mean_y) print("对应y最大值:", max_y)
运行后会得到:
唯一x值: [ 0.2 1.2 1.8 2.3 4.5 5.3 15.5 17.2 18.3 20. ] 对应y平均值: [10.3 10.3 11.8 12.3 11.5 12.3 12.5 15.2 10.3 10.75] 对应y最大值: [10.3 10.3 11.8 12.3 11.5 12.3 12.5 15.2 10.3 11.5]
这样就完美实现了你的需求——合并x数组并对重复x对应的y值进行聚合,全程没有显式遍历原始数组的元素~
内容的提问来源于stack exchange,提问作者D.Giunchi
相关产品推荐
相关产品推荐

