使用多个条件对列表/张量进行掩码处理?

5
以下代码掩码良好。
mask = targets >= 0
targets = targets[mask]

然而,当我尝试使用两个条件进行掩蔽时,它会出现错误:RuntimeError: Boolean value of Tensor with more than one value is ambiguous

mask = (targets >= 0 and targets <= 5)
targets = targets[mask]

有办法做到这点吗?


1
将括号更改为(targets>=0) & (targets<=5),以在两个数组之间使用and,详见我的回答。 - Akshay Sehgal
2个回答

6
您在使用括号时犯了一个错误。请在每个条件周围加上括号,以便NumPy将它们视为单独的数组。
targets = np.random.randint(0,10,(10,))

mask = (targets>=0) & (targets<=5) #<----------

print(mask)
targets[mask]

[ True False  True False False  True  True  True False  True]
array([4, 1, 3, 1, 5, 3])

您可以使用多个掩码创建一些复杂的逻辑,然后直接使用它们来索引一个数组。例如 - XNOR 可以写成 ~(mask1 ^ mask2)

输入图像描述


2
使用np.logical_and创建一个掩码进行连接,因为它返回一个新的掩码,将两个条件组合在一起,而不是返回一个布尔值。
targets = np.array([-1,0,1,2,3,4,5,6])
mask = np.logical_and(targets >= 0, targets <= 5) # == [0,1,1,1,1,1,0]

print(targets[mask]) # [0,1,2,3,4,5]

编辑:我看到你正在使用pytorch,这个过程基本相同,只需使用torch.logical_and即可。


2
我认为这是一个非常好的答案!由于我只能接受一个,我接受了Akshay的答案,因为我觉得他的略微更加简洁。 - joshua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接