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

如何使用索引数组将Numpy数组分组为多个子数组?

按对应索引数组分组NumPy数组的解决方案

这问题我太懂了!要实现按数组b的取值对数组a进行分组,用NumPy就能高效搞定,不管数据规模多大都适用。给你几个实用的实现方式:

方法1:简洁字典推导式(快速实现)

直接利用布尔索引筛选元素,一行代码就能构建目标字典:

import numpy as np

a = np.array([18, 56, 32, 75, 55, 55])
b = np.array([0, 2, 3, 2, 2, 2])

# 构建分组字典c
c = {val: a[b == val] for val in np.unique(b)}

# 验证结果
print(c[0])   # 输出: array([18])
print(c[2])   # 输出: array([56, 75, 55, 55])
print(c[3])   # 输出: array([32])

这种写法直观易懂,适合大多数日常场景。唯一要注意的是,np.unique(b)会返回排序后的唯一值,但因为我们用值作为字典的键,顺序不影响最终的分组结果。

方法2:更高效的批量索引(适合大规模数据)

如果你的实际数据量很大,重复执行b == val会多次遍历数组,效率稍低。可以用np.unique的return_inverse参数一次性获取分组索引,再批量提取元素:

import numpy as np

a = np.array([18, 56, 32, 75, 55, 55])
b = np.array([0, 2, 3, 2, 2, 2])

# 获取唯一值和每个元素对应的分组索引
unique_vals, group_indices = np.unique(b, return_inverse=True)

c = {}
for val in unique_vals:
    # 筛选出当前分组的所有元素
    c[val] = a[group_indices == np.where(unique_vals == val)[0][0]]

# 验证结果和之前一致
print(c[0])   # array([18])
print(c[2])   # array([56, 75, 55, 55])
print(c[3])   # array([32])

这种方法只需要遍历一次数组获取分组索引,后续的筛选都是基于索引的快速操作,性能更优。

额外技巧:保持分组顺序和首次出现一致

如果需要字典的键顺序和b中值首次出现的顺序一致(比如示例里的0→2→3),可以用return_index参数来实现:

unique_vals, first_indices = np.unique(b, return_index=True)
# 按首次出现的顺序排序唯一值
sorted_vals = unique_vals[np.argsort(first_indices)]

c = {val: a[b == val] for val in sorted_vals}

这样字典c的键顺序就和你示例里的完全匹配啦。

内容的提问来源于stack exchange,提问作者Bryce Frank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:26:47