NumPy数组切片时维度如何变化?解析两段转置差异代码
NumPy切片的维度变化规则与转置差异解析
先提个小笔误:你代码里的numpy.arange(4,3)会生成空数组,肯定是手滑了,我默认改成numpy.arange(12).reshape(4,3)来分析,这样代码能正常跑起来~
核心维度变化规则
NumPy数组切片/索引时的维度变化,关键看你用的是切片操作还是单个索引:
- 用切片(比如
start:end、-1:这种形式):会保留原数组的维度结构。哪怕你只切出一行或一列,结果依然是和原数组维度数一致的数组(比如2D数组切一列,结果是(n,1)的2D数组)。 - 用单个索引(比如
-1、2这种单个数值):会直接「压缩」掉被索引的那个维度,结果的维度数比原数组少1(比如2D数组取某一列的单个索引,结果是(n,)的1D数组)。
两段代码的差异分析
第一段:转置生效的代码
修正后的可运行代码:
import numpy as np b = np.arange(12).reshape(4,3) # 生成4行3列的2D数组 print(b[1:3,-1:]) print(b[1:3,-1:].shape) print(b[1:3,-1:].T) print(b[1:3,-1:].T.shape)
运行结果示例:
[[ 5] [ 8]] (2, 1) [[5 8]] (1, 2)
为什么转置生效?
b[1:3,-1:]中,行维度用了切片1:3(取第2、3行),列维度用了切片-1:(取最后一列)。因为都是切片操作,结果保留了2D结构,shape为(2,1)。- 2D数组的转置
.T会交换两个维度的位置,所以(2,1)转置后变成(1,2),转置效果非常明显。
第二段:转置“不生效”的代码
修正后的代码:
import numpy as np b = np.arange(12).reshape(4,3) print(b[1:3,-1]) print(b[1:3,-1].shape) print(b[1:3,-1].T) print(b[1:3,-1].T.shape)
运行结果示例:
[5 8] (2,) [5 8] (2,)
为什么看起来转置没效果?
b[1:3,-1]中,行维度是切片,但列维度用了单个索引-1,这会直接压缩列维度,结果变成了1D数组,shape为(2,)。- NumPy的1D数组没有“转置”的概念——它只有一个维度,转置操作不会改变它的结构,所以输出和原数组完全一样,看起来像是转置没生效。
小技巧:如何保留维度实现转置
如果想取单一行/列时依然能转置,有两种简单办法:
- 用切片代替单个索引:比如把
-1改成-1:,就像第一段代码那样。 - 手动增加维度:用
np.newaxis(或None)扩展维度,比如b[1:3,-1, np.newaxis],得到的也是(2,1)的2D数组,转置后就能得到(1,2)的结果。
内容的提问来源于stack exchange,提问作者kosmos
相关产品推荐
相关产品推荐

