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

求助:为何部分切片可行,部分触发ValueError: result of slicing is an empty tensor

张量切片空张量报错的原因与解决思路

嘿,这个问题我太熟了!之前处理张量的时候没少踩这个坑,咱们一步步来捋清楚为啥有的切片正常,有的会抛出ValueError: result of slicing is an empty tensor~

本质上这个错误的核心就是:你写的切片规则,最终没有从原张量里选中任何元素,导致得到了一个没有内容的空张量。下面分几种常见情况给你拆解,再配点例子好理解:

1. 切片范围超出了原张量的有效索引

这是最常见的情况。每个张量的每个维度都有固定的长度,索引是从0开始的,如果你切片的起始位置直接超过了该维度的最大有效索引,或者结束位置小于起始位置(步长为正的情况下),就会得到空张量。

举个PyTorch的例子:

import torch
# 创建一个3×3的张量
t = torch.arange(9).reshape(3, 3)
print(t.shape)  # 输出 torch.Size([3, 3]),说明行和列的长度都是3,索引范围是0-2

正常切片(有元素):

# 取前2行、所有列,完全在有效范围内
valid_slice = t[:2, :]
print(valid_slice)
# 输出:
# tensor([[0, 1, 2],
#         [3, 4, 5]])

报错切片(空张量):

# 取列索引从3开始的部分,但原张量列的最大索引是2,3已经超出范围
invalid_slice = t[:, 3:]
# 这里就会直接抛出 ValueError: result of slicing is an empty tensor

2. 步长设置不合理导致无元素选中

步长是切片里容易忽略的参数,一旦步长方向和起止索引的方向不匹配,就会出现空张量。

比如步长为正的时候,要求起始索引 ≤ 结束索引;步长为负的时候,要求起始索引 ≥ 结束索引,否则都不会选中任何元素。

例子:

t = torch.arange(5)  # 张量是 [0,1,2,3,4],长度5,索引0-4

步长正,但起始>结束:

# 步长默认是1(正),但起始索引3 > 结束索引1,没有元素能被选中
invalid_slice = t[3:1]
# 触发空张量报错

步长负,但起始<结束:

# 步长为-1(倒序取),但起始索引1 < 结束索引3,方向不匹配
invalid_slice = t[1:3:-1]
# 同样触发报错

怎么排查和解决?

  • 先看张量形状:切片前先打印your_tensor.shape,确认每个维度的长度和有效索引范围
  • 检查切片参数:对应每个维度的切片start:end:step,确保逻辑合理:
    • 步长为正:start < end,且start不超过维度长度-1
    • 步长为负:start > end,且end不小于0
  • 动态索引加判断:如果是代码里动态生成的切片索引,最好加个条件判断,比如先检查切片后的形状是否有元素,再进行后续操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:02:53