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
相关产品推荐
相关产品推荐

