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

NumPy索引时轴为何转置?不同索引方式下轴顺序翻转原因求解

NumPy索引轴顺序变化原因解释

这个差异本质是NumPy中基本索引和高级索引的轴排列规则不同导致的,具体拆解如下:

1. 切片索引的情况(对应M[0,:,5:10].shape为(500,5))

切片、整数标量都属于基本索引范畴,遵循的规则很简单:

  • 整数标量索引会直接删除对应维度:这里第一个位置的0是整数索引,直接把形状为1的第一个维度删掉
  • 剩下的维度严格按照原有顺序保留:第二个位置的切片:保留原形状500,第三个位置的切片5:10保留选中的5个元素,所以最终形状就是(500, 5),轴顺序和原数组一致。

2. 整数数组索引的情况(对应M[0,:,np.arange(5,10)].shape为(5,500))

使用ndarray作为索引属于高级索引范畴,当索引中同时存在切片和高级索引数组时,NumPy会遵循如下轴排列规则:

所有高级索引产生的维度会被统一移动到最前面,切片对应的维度按原有顺序跟在高级索引维度之后。
在这个例子里:

  • 第一个位置的0还是整数标量,删除第一个维度
  • 第二个位置的:是切片,对应维度长度500
  • 第三个位置的np.arange(5,10)是长度为5的高级索引数组,产生的长度为5的维度会被放到切片维度的前面
    所以最终轴顺序就变成了(高级索引维度长度, 切片维度长度)也就是(5, 500)。

补充:如果要保持和切片一致的轴顺序怎么办?

你可以把索引操作拆成两步,避免切片和高级索引混用:

# 先取前两个维度,再用高级索引取最后一个维度
M[0,:][:, np.arange(5,10)].shape # 输出 (500,5)

或者直接用np.take方法指定轴:

np.take(M[0,:], np.arange(5,10), axis=1).shape # 输出 (500,5)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:24:01