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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:21:19