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

使用NumPy普通与高级索引时出现意外结果:为何最后一个数组被转置?

为什么NumPy混合索引后数组形状被转置了?

先看你给出的代码示例:

import numpy as np

a = np.random.rand(123, 45, 3)

print(a[:, :, [0, 1]].shape)  # (123, 45, 2)
print(a[:, 0, [0, 1]].shape)  # (123, 2)
print(a[0, :, [0, 1]].shape)  # (2, 45)

核心原因是NumPy处理普通索引(切片、标量)和高级索引(整数数组、布尔数组)混合时的特殊规则:

  • 如果高级索引是连续的最后几个维度,结果形状会保留普通索引的维度顺序,再追加高级索引的维度。比如第一个例子,高级索引在最后一维,直接把原数组第三维从3改成2,形状保持(123,45,2);第二个例子里中间的标量索引直接降维,剩下的普通切片(第一维)在前,高级索引(第三维)在最后,所以形状是(123,2),符合直觉。
  • 如果高级索引和普通切片索引交替出现(不是连续的末尾维度),NumPy会把所有高级索引的维度放到结果形状的最前面,再跟普通切片的维度。第三个例子中,高级索引在第三维,中间的第二维是普通切片,两者位置交替,所以高级索引对应的维度(2)被移到了前面,普通切片的维度(45)在后面,最终形状就变成了(2,45)。

说白了就是:混合索引时,不在末尾的高级索引会“抢位置”到结果形状的最前面,而不是留在原来的维度位置上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:22:36