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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:19:46