首先,这基本上与Numpy array loss of dimension when masking相同,但对于PyTorchTensor而不是NumPy数组。这个问题的solution(s),使用等价的PyTorch函数torch.where
或masked tensors工作,但我发现Google搜索PyTorchTensor并没有很快找到答案。所以,我想一个等价的StackOverflow pytorch标记问题可能对其他人有用!)
我有一个2D PyTorchTensor(尽管它可能有更多的维度),我想应用一个等效形状的二进制掩码。然而,当我应用掩码时,输出只是一维的。如何在应用遮罩后保持与原始Tensor相同的尺寸?
例如用于
import torch
x = torch.tensor([[1.0, 2.0, 8.0], [-4.0, 0.0, 3.0]])
mask = x >=2.0
print(x[mask])
tensor([2., 8., 3.])
输出现在是1D而不是2D。
2条答案
按热度按时间e5njpo681#
使用
torch
的where
函数,我们将得到行,列tensors
如下:其输出:
然而,将其插入
x
将仅输出mask
的艾德化值,从而使我们得到1Dtensor
,因为我们正在摆脱tensor
中的所有值,这些值的计算结果不为True
(因此它不可能与原始tensor
的形状相同,因为它的值较少,因此它被展平为一维)。如果你想让
x
是它的原始形状,但 onlywhere
mask
的艾德值是Truth
y,那么我们可以在这些索引处用1填充一个0的tensor
:输出:
所以现在
masked_x
是一个tensor
的零,形状与x
相同,但与1where
,mask
是Truth
y。如果你想让
masked_x
由x
的值where
组成,那么mask
就是Truth
y,那么:输出:
0的
tensor
where
mask
是False
y。如果你想要别的东西,请澄清。
fnx2tebb2#
就像numpy question中建议的那样,
torch.where
可以实现这一点。为了保持相同的维度,你需要一个填充值。在下面的示例中,我使用0,但您也可以使用torch.nan
返回