numpy结构化数组如何按唯一X值分组获取对应Y值集合
NumPy按x值分组y值实现方法
直接利用np.unique的返回索引参数即可实现高效分组,不需要依赖第三方库,大数据量下性能远高于纯Python字典循环分组。
基础版本(x按值排序输出)
import numpy as np # 原有构造结构化数组的代码 arr1 = (np.array([32, 32, 32, 32, 32, 39, 21], dtype=np.int64),np.array([449, 451, 452, 453, 454, 463, 340], dtype=np.int64)) arr1_x = arr1[0] arr1_y = arr1[1] arr1_struct = np.empty(arr1_x.shape[0], dtype=[('x', int), ('y', int)]) arr1_struct["x"] = arr1_x arr1_struct["y"] = arr1_y # 核心分组逻辑 x_unique, inv_mapping = np.unique(arr1_struct["x"], return_inverse=True) y_grouped = [arr1_struct["y"][inv_mapping == group_id].tolist() for group_id in range(len(x_unique))]
这个版本输出的x_unique是按x值升序排列的[21, 32, 39],对应的y_grouped为[[340], [449, 451, 452, 453, 454], [463]]。
保持x首次出现顺序的版本
如果需要和示例中一致,按x在原数组里第一次出现的顺序输出,只需要多取一个首次出现位置的返回值,重新排序即可:
x_unique, first_occur_idx, inv_mapping = np.unique( arr1_struct["x"], return_index=True, return_inverse=True ) # 按首次出现位置排序,还原原顺序 sort_order = first_occur_idx.argsort() x_unique = x_unique[sort_order] y_grouped = [arr1_struct["y"][inv_mapping == sort_order[i]].tolist() for i in range(len(x_unique))]
运行后输出完全匹配需求格式:
x_unique=[32, 39, 21]y_grouped=[[449, 451, 452, 453, 454], [463], [340]]
扩展说明
如果不需要转成Python列表,直接保留NumPy数组做后续数值计算(比如求每组y的和、均值、极值),可以去掉.tolist(),直接用布尔索引做向量化运算,性能会更高。
内容的提问来源于stack exchange,提问作者geekygeek
相关产品推荐
相关产品推荐

