PyTorch广播筛选张量时报Boolean value of Tensor错误如何解决
问题原因
你遇到的报错本质是Python原生的not in运算符不支持PyTorch张量的逐元素判断:
- 你写的
torch.arange(Sim.size(0)) not in samples_idx逻辑是Python尝试把整个形状为(5,)的张量作为单个对象,判断它是否不在samples_idx列表里,而不是逐元素判断每个值是否不在列表中 - PyTorch无法把包含多个值的张量直接转换为单个布尔值,因此触发
RuntimeError: Boolean value of Tensor with more than one value is ambiguous报错。
正确实现方式
推荐用PyTorch内置的torch.isin()接口实现逐元素存在性判断,再取反得到「不在指定索引列表」的布尔掩码:
import torch Sim = torch.rand((5, 5)) samples_idx = [0] # 需要排除的索引 # 生成逐元素判断的布尔掩码:~是按位取反,对应不在列表中的条件 a = ~torch.isin(torch.arange(Sim.size(0)), torch.tensor(samples_idx)) result = Sim[a]
运行后a就是你预期的形状为(5,)的布尔张量,result会保留Sim中索引不为0的所有行。
如果使用的PyTorch版本低于1.10(无torch.isin接口),可以用广播比对实现相同逻辑:
a = (torch.arange(Sim.size(0)).unsqueeze(1) != torch.tensor(samples_idx)).all(dim=1)
内容的提问来源于stack exchange,提问作者Zhongzheng_11
相关产品推荐
相关产品推荐

