如何在PyTorch中将Tensor按行乘以向量?

q3qa4bjr  于 2022-11-23  发布在  其他
关注(0)|答案(4)|浏览(166)

当我有一个形状为[12, 10]的Tensorm和一个形状为[12]的标量向量s时,我如何将m的每一行与s中相应的标量相乘?

j2cgzkjk

j2cgzkjk1#

您需要添加相应的单一维:

m * s[:, None]

当将(12, 10)Tensor乘以(12, 1)Tensor时,s[:, None]具有(12, 1)的大小。

oyxsuwqo

oyxsuwqo2#

可以将向量广播到更高维的Tensorlike so

def row_mult(input, vector):
    extra_dims = (1,)*(input.dim()-1)
    return t * vector.view(-1, *extra_dims)
q43xntqr

q43xntqr3#

如果你事先知道维度的数目,并且可以硬编码None的正确数目,那么Shai的答案是有效的。
第一个
如果要处理可变或未知维度的数据,则可能需要手动将mask扩展为正确的形状

mask = (torch.rand(12) > 0.5).int()
while mask.dim() < data.dim(): mask.unsqueeze_(1)
result = data * mask

result.shape  # torch.Size([12, 2, 3, 4])
mask.shape    # torch.Size([12, 1, 1, 1])

这是一个有点丑陋的解决方案,但它确实有效。可能有一个更优雅的方法来正确地为可变维数内联重塑maskTensor

5sxhfpxr

5sxhfpxr4#

一个刚开始有点难以理解,但非常强大的技巧是使用爱因斯坦求和:

torch.einsum('i,ij->ij', s, m)

相关问题