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

如何将不等长嵌套列表转换为torch.LongTensor?

解决不等长嵌套列表转torch.LongTensor的报错问题

PyTorch的张量要求所有维度的长度必须统一,直接传入不等长的嵌套列表会触发TypeError: not a sequence,因为框架无法推断出规整的张量形状。下面是两种实用的解决方法:

方法一:填充至统一长度(通用场景)

先找出所有子列表里的最长长度,给每个短子列表补占位符(比如0),确保所有子列表长度一致后再转张量:

import torch

tmp = [[7, 1], [8, 4, 0], [9]]
# 获取最长子列表的长度
max_length = max(len(item) for item in tmp)
# 给每个子列表补0到最长长度
padded_list = [item + [0]*(max_length - len(item)) for item in tmp]
# 转换为LongTensor
result_tensor = torch.LongTensor(padded_list)
print(result_tensor)

输出结果:

tensor([[7, 1, 0],
        [8, 4, 0],
        [9, 0, 0]])

方法二:使用PackedSequence(序列建模场景)

如果是处理RNN、LSTM这类序列任务,不想用填充浪费计算资源,可以用pack_sequence打包不等长序列,它会保留原始序列长度,只计算有效部分:

import torch
from torch.nn.utils.rnn import pack_sequence, pad_packed_sequence

tmp = [[7, 1], [8, 4, 0], [9]]
# 先把每个子列表转成单个LongTensor
single_tensors = [torch.LongTensor(item) for item in tmp]
# pack_sequence要求输入按序列长度降序排列
sorted_tensors = sorted(single_tensors, key=lambda x: len(x), reverse=True)
# 打包成PackedSequence
packed_seq = pack_sequence(sorted_tensors)
print(packed_seq)

# 如需还原为填充后的张量,可使用pad_packed_sequence
padded_tensor, seq_lengths = pad_packed_sequence(packed_seq)
print("\n还原后的填充张量:")
print(padded_tensor)
print("原始序列长度:", seq_lengths)

输出结果:

PackedSequence(data=tensor([8, 7, 9, 4, 1, 0]), batch_sizes=tensor([3, 2, 1]), sorted_indices=None, unsorted_indices=None)

还原后的填充张量:
tensor([[8, 7, 9],
        [4, 1, 0],
        [0, 0, 0]])
原始序列长度: tensor([3, 2, 1])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:20:43