如何理解NumPy中arr[ind1,ind2]的多维索引逻辑?
NumPy数组配对索引原理解析
先看原数组的实际内容,方便后续对照:
import numpy as np arr = np.arange(9, dtype = "float").reshape(3,3) # 输出arr: # [[0. 1. 2.] # [3. 4. 5.] # [6. 7. 8.]]
核心逻辑:逐位置配对的行+列索引
arr[ind1, ind2]属于NumPy的整数数组索引,规则很直接:
ind1里的每个元素对应目标元素的行索引,ind2对应位置的元素对应目标元素的列索引- 两个索引数组的形状必须完全一致(这里都是2×2),最终输出的形状和索引数组的形状完全相同
我们逐个位置拆解取值逻辑:
- 第0行第0列:
ind1[0,0]=1(行1),ind2[0,0]=0(列0)→ 取arr[1,0] = 3.0 - 第0行第1列:
ind1[0,1]=2(行2),ind2[0,1]=2(列2)→ 取arr[2,2] = 8.0 - 第1行第0列:
ind1[1,0]=0(行0),ind2[1,0]=1(列1)→ 取arr[0,1] = 1.0 - 第1行第1列:
ind1[1,1]=1(行1),ind2[1,1]=2(列2)→ 取arr[1,2] = 5.0
把这些结果按索引数组的2×2形状排列,就得到arr[ind1, ind2]的输出:
[[3. 8.] [1. 5.]]
为什么输出是2×2矩阵?
因为ind1和ind2都是2×2的二维数组,NumPy会严格按照索引数组的形状生成结果——每个索引位置对应一个取值,最终结果的维度和索引数组完全一致。
和单索引的区别
你已经理解的arr[ind1]是取整行:比如ind1[0,0]=1会取第1行的所有元素[3. 4. 5.],最终输出是3×3的数组;而arr[ind1, ind2]是精准定位到单个元素,通过行+列的配对组合,直接提取对应位置的标量,再按索引形状重组。
内容的提问来源于stack exchange,提问作者GUNAMRIT SINGH
相关产品推荐
相关产品推荐

