Numpy索引操作中维度异常翻转问题咨询
Numpy索引混合使用时的维度顺序问题
这本质是numpy**高级索引(整数数组/列表索引)和基础索引(切片、单元素索引)**混合使用时的维度优先级规则导致的。
核心规则
当你在同一个索引操作里同时用了高级索引和基础索引时:
- numpy会把所有高级索引对应的维度优先放到结果数组的最前面
- 剩下的基础索引对应的维度则按照原数组的维度顺序跟在后面
对应你的例子拆解
原数组形状:(8193, 10, 15, 2, 2)(维度0到4,对应你说的1到5维)
问题操作:a[:,[0,3],:,:,0]
这里的索引类型:
- 维度0:
:→ 基础索引(切片) - 维度1:
[0,3]→ 高级索引(整数列表) - 维度2:
:→ 基础索引 - 维度3:
:→ 基础索引 - 维度4:
0→ 基础索引(单元素,会压缩该维度)
按照规则,高级索引对应的维度(维度1,长度2)会被放到结果最前面,剩下的基础索引维度按原顺序排列:维度0(8193)、维度2(15)、维度3(2),所以结果形状就是(2, 8193, 15, 2),也就是你看到的维度翻转。
正常操作1:a[:,[0,3]][:,:,:,:,0]
这是分步索引:
- 第一步
a[:,[0,3]]:只有维度1是高级索引,其余都是基础索引。此时因为没有多个高级索引混合,numpy会保留原维度顺序,把维度1的长度从10替换为2,得到形状(8193, 2, 15, 2, 2) - 第二步
[:,:,:,:,0]:对最后一维取单元素(基础索引),压缩该维度后得到(8193, 2, 15, 2),符合预期。
正常操作2:a[:,[0,3],0,:,:]
这里维度2用了单元素索引(基础索引,直接压缩该维度),只有维度1是高级索引。同样因为没有多个高级索引混合,高级索引的维度保持在原位置,所以结果形状是(8193, 2, 2, 2),符合预期。
解决方法
如果想在单次索引里得到正确顺序的结果,可以:
- 用分步索引(像你第二种操作那样)
- 用
np.take指定轴来选取元素:np.take(a, [0,3], axis=1)[:,:,:,:,0],这样能保证维度顺序不变 - 对结果做转置调整:
a[:,[0,3],:,:,0].transpose(1,0,2,3),把维度1和0交换位置
内容的提问来源于stack exchange,提问作者herrzinter
相关产品推荐
相关产品推荐

