t[-1:, 1:4, 0:3:2]张量范围索引 / 切片讲得明明白白!


一、先记住 3 条黄金规则(学会就永远不会错)

  1. 逗号 , = 分隔维度

    张量几维,就有几个逗号分隔项

  2. 冒号 : = 取全部 / 从哪到哪

    • start:end → 从 start 开始,不包含 end
    • start: → 从 start 到最后
    • :end → 从最前到 end
    • : → 取全部
  3. 负数 = 倒数

    • -1 = 最后一个
    • -2 = 倒数第二个

二、我先造一个和你一样的 3 维张量

import torch

# 形状:(2, 5, 4)
# 维度0:2个矩阵
# 维度1:每个矩阵 5 行
# 维度2:每行 4 列
t = torch.randint(0, 10, (2, 5, 4))

这个张量长这样:

0个矩阵:
[
    [a,b,c,d],0[e,f,g,h],1[i,j,k,l],2[m,n,o,p],3[q,r,s,t]4]1个矩阵:
[
    [1,2,3,4],0[5,6,7,8],1[9,10,11,12],2[13,14,15,16],3[17,18,19,20]4]

三、逐行讲解你看不懂的代码

1)print(t[1, 1:])

翻译成人话:

  • 第 1 个维度(最外层)取 1 → 拿第 1 个矩阵
  • 第 2 个维度取 1: → 从第 1 行开始,取到最后一行
  • 第 3 个维度不写 → 取全部列

结果:

取第 1 个矩阵的 第 1、2、3、4 行,所有列

[
    [5,6,7,8],
    [9,10,11,12],
    [13,14,15,16],
    [17,18,19,20]
]

2)print(t[-1:, 1:4, 0:3:2])

这是复杂切片,我拆成 3 段讲:

格式:

t[ 维度0 , 维度1 , 维度2 ]

第一段:-1: → 维度 0

  • -1 = 最后一个
  • 所以 -1: = 取最后 1 个矩阵

第二段:1:4 → 维度 1

  • 第 1 行 开始
  • 第 4 行结束(不包含 4)
  • 取:第 1、2、3 行

第三段:0:3:2 → 维度 2(最难!)

格式:start : end : step

  • 0 → 从第 0 列开始
  • 3 → 到第 3 列结束(不包含)
  • 2步长 2,每隔一个取一个

所以取:第 0 列、第 2 列


最终整句翻译(超级重要)

t[-1:, 1:4, 0:3:2]

= 最后一个矩阵

  • 第 1、2、3 行
  • 第 0、2 列

最终取出的结果长这样

[
    [5,7],     # 第1行:第0列、第2列
    [9,11],    # 第2行:第0列、第2列
    [13,15]    # 第3行:第0列、第2列
]

四、我再给你总结成万能口诀(永远不会忘)

  • 逗号 = 切维度
  • 冒号 = 取范围
  • 负数 = 倒数
  • start:end → 左闭右开
  • start🔚step → 隔 step 取一个

更多推荐