为何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
相关产品推荐
相关产品推荐

