为何numpy数组arr3d[0,:,[0,1,2]]与arr3d[0][:,[0,1,2]]结果不同?
Numpy数组索引结果差异问题解答
先看你给出的代码:
import numpy as np a=np.ones((1,4,4)) shape1=a[0,:,[0,1,2]].shape shape2=a[0][:,[0,1,2]].shape
得到shape1=(3,4),shape2=(4,3),核心原因是两种索引操作的执行逻辑完全不同:
a[0,:,[0,1,2]]:一步式混合索引
原数组a的形状是(1,4,4),这行代码是把三个索引参数放在同一个方括号里,属于基本索引(0和:)与高级整数数组索引([0,1,2])的混合使用。
Numpy处理混合索引时,会优先将所有高级索引对应的维度排列在结果形状的前面:这里[0,1,2]是长度为3的整数数组,对应一个维度;:对应原数组中长度为4的维度。所以最终形状是(3,4)。a[0][:,[0,1,2]]:分步式索引
这是两次独立的索引操作:- 第一步
a[0]:从原数组中取出第一个维度的元素,把(1,4,4)的数组降维成(4,4)的二维数组; - 第二步
[:,[0,1,2]]:对这个二维数组做列索引,取出每一行的第0、1、2列,相当于保留4行,选取3列,所以结果形状是(4,3)。
- 第一步
内容的提问来源于stack exchange,提问作者孟文明
相关产品推荐
相关产品推荐

