Pytorch 如何在使用pytrorch masked_select时保留2D(或更多)形状
假设我有以下两个匹配的形状张量:Pytorch 如何在使用pytrorch masked_select时保留2D(或更多)形状,pytorch,Pytorch,假设我有以下两个匹配的形状张量: a = tensor([[ 0.0113, -0.1666, 0.5960, -0.0667], [-0.0977, -0.1984, 0.5153, 0.0420]]) selectors = tensor([[ True, True, False, False], [ True, False, True, False]]) 使用torch.masked_选择查找a中与选择器中的真索引匹配的值,如下所示: torch.masked_select(a
a = tensor([[ 0.0113, -0.1666, 0.5960, -0.0667], [-0.0977, -0.1984, 0.5153, 0.0420]])
selectors = tensor([[ True, True, False, False], [ True, False, True, False]])
使用torch.masked_选择查找a
中与选择器中的真索引匹配的值,如下所示:
torch.masked_select(a, selectors)
输出将为1D形状,而不是原始2D形状:
tensor([ 0.0113, -0.1666, -0.0977, 0.5153])
这与文档()中给出的masked_select
行为一致。然而,我的目标是得到一个匹配两个原始张量形状的结果。即:
tensor([[0.0113, -0.1666], [-0.0977, 0.5153]])
有没有一种方法可以在不需要遍历张量中的所有元素并找到每个元素的掩码的情况下得到这个结果?请注意,我也研究过使用,但它不适合我所看到的情况。注意,masked_select的先决条件没有指定每行必须有相同数量的True
条目,因此无法保留输出形状(例如,True
s的总数可以是一个素数,那么最终的形状是什么?)。您可以在执行蒙版选择后使用张量。重塑
,将输出重塑为您想要的任何有效形状。在您的示例中,您可以执行火炬。蒙版选择(a,选择器)。重塑(a.shape[0],-1)
只要选择器中的每一行都有相同数量的True
条目,它就可以工作。你是对的。我刚刚意识到了这一点。我的最终目标是根据选择器中的布尔值,从a
中的第二维度找到给定子集的最大值(即找到[0.0113,-0.1666]的最大值)
和[-0.0977,0.5153]
)因此,我想我最好的选择是循环两个张量的第二维,然后在列表中收集子集或动态查找最大值。请注意,masked_select的前提条件没有指定每行必须有相同数量的True
条目,因此无法保留输出形状(例如,True
s的总数可以是一个素数,那么最终的形状是什么?)。您可以在执行蒙版选择后使用张量。重塑
,将输出重塑为您想要的任何有效形状。在您的示例中,您可以执行火炬。蒙版选择(a,选择器)。重塑(a.shape[0],-1)
只要选择器中的每一行都有相同数量的True
条目,它就可以工作。你是对的。我刚刚意识到了这一点。我的最终目标是根据选择器中的布尔值,从a
中的第二维度找到给定子集的最大值(即找到[0.0113,-0.1666]的最大值)
和[-0.0977,0.5153]
)。因此,我想我最好的选择是循环两个张量的第二维,然后在列表中收集子集,或者动态查找最大值。