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

如何从给定的多维索引中获取NumPy数组元素?

如何用矩阵化方法从NumPy数组中按索引提取元素?

嘿,这是个很好的问题!NumPy最强大的地方之一就是它的向量/矩阵化操作,完全可以避开Python循环来高效完成这个需求,而且性能会比逐元素循环好很多,尤其是当你的索引列表很长的时候。

方法1:拆分索引为行、列数组

你可以把索引列表转换成NumPy数组,然后分别提取行索引和列索引的一维数组,再直接用NumPy的整数数组索引功能提取元素:

import numpy as np

# 定义你的索引和数组
ind = [(1,5),(2,2),(3,1)]
arr = np.arange(36).reshape(6,6)

# 将索引列表转为NumPy数组
ind_array = np.array(ind)
# 提取所有行索引和列索引
row_indices = ind_array[:, 0]
col_indices = ind_array[:, 1]

# 矩阵化提取元素
result = arr[row_indices, col_indices]
print(result)  # 输出: [11 14 19]

原理很简单:NumPy支持整数数组索引,当你传入两个长度相同的一维数组作为行和列索引时,它会自动逐个对应提取arr[row_indices[i], col_indices[i]]的元素,整个过程是底层C实现的,没有Python层面的循环。

方法2:更简洁的元组解包写法

如果你想让代码更紧凑,可以直接对转置后的索引数组做元组解包,一步到位:

result = arr[tuple(np.array(ind).T)]

这里np.array(ind).T会把形状为(3,2)的索引数组转置成(2,3),再转成元组后,就变成了(array([1,2,3]), array([5,2,1]))——这正好是NumPy索引需要的行、列数组格式,所以同样能得到正确结果。

为什么这比循环好?

Python的for循环在处理大量元素时会有明显的性能瓶颈,而NumPy的矩阵化操作是在C层面执行的,速度能提升几个数量级,同时代码也更简洁易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:16:32