【问题标题】:mask list/tensor with multiple conditions?具有多个条件的掩码列表/张量?
【发布时间】:2021-04-12 18:19:05
【问题描述】:

以下代码很好地掩饰

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]

有没有办法做到这一点?

【问题讨论】:

  • 将括号更改为 (targets&gt;=0) &amp; (targets&lt;=5) 以在 2 个数组之间使用 and,详细信息请参见下面的答案。

标签: python list pytorch mask tensor


【解决方案1】:

使用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即可。

【讨论】:

  • 我认为这是一个非常好的答案!由于我只能接受一个,我接受了 Akshay 的原因,我觉得他的清洁度略高。
【解决方案2】:

您在使用括号时犯了一个错误。将每个条件括起来,以便 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多