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

为何torch张量作为defaultdict键会生成新键?求解决方法

解决torch张量作为defaultdict键的重复键问题

问题核心在于:每次调用torch.tensor(1)都会生成全新的张量对象——哪怕数值完全相同,这些对象的内存地址不同,哈希值也不一样,因此defaultdict会把它们识别成两个独立的键。

以下是几种可行的解决方法:

方法1:将张量转为Python原生类型(适合标量张量)

如果你的键是单个数字的标量张量,直接转成int/float这类原生类型作为键,这类类型的哈希是基于数值的:

from collections import defaultdict
import torch

b = defaultdict(list)
b[int(torch.tensor(1))].append(2)
b[int(torch.tensor(1))].append(3)
print(b)  # 输出: defaultdict(<class 'list'>, {1: [2, 3]})

标量张量也可以用.item()方法获取原生值:torch.tensor(1).item(),效果和转int一致。

方法2:将多维张量转为可哈希的结构(适合非标量张量)

如果是多维张量,把它的数值转成元组(元组是可哈希类型)作为键:

b = defaultdict(list)
# 多维张量转扁平化元组
key = tuple(torch.tensor([1, 2, 3]).flatten().tolist())
b[key].append(2)
# 相同数值的张量转成同样的元组
b[tuple(torch.tensor([1, 2, 3]).flatten().tolist())].append(3)
print(b)  # 输出: defaultdict(<class 'list'>, {(1, 2, 3): [2, 3]})

方法3:复用同一个张量实例

如果业务场景允许,提前创建一次张量,之后重复使用这个对象作为键:

b = defaultdict(list)
# 提前创建好键对应的张量
key_tensor = torch.tensor(1)
b[key_tensor].append(2)
b[key_tensor].append(3)
print(b)  # 输出: defaultdict(<class 'list'>, {tensor(1): [2, 3]})

这种方法会保留张量作为键的形式,但必须确保所有操作都复用同一个张量对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:15:02