当我有一个形状为[12, 10]的Tensorm和一个形状为[12]的标量向量s时,我如何将m的每一行与s中相应的标量相乘?
[12, 10]
m
[12]
s
j2cgzkjk1#
您需要添加相应的单一维:
m * s[:, None]
当将(12, 10)Tensor乘以(12, 1)Tensor时,s[:, None]具有(12, 1)的大小。
(12, 10)
(12, 1)
s[:, None]
oyxsuwqo2#
可以将向量广播到更高维的Tensorlike so:
def row_mult(input, vector): extra_dims = (1,)*(input.dim()-1) return t * vector.view(-1, *extra_dims)
q43xntqr3#
如果你事先知道维度的数目,并且可以硬编码None的正确数目,那么Shai的答案是有效的。第一个如果要处理可变或未知维度的数据,则可能需要手动将mask扩展为正确的形状
None
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
5sxhfpxr4#
一个刚开始有点难以理解,但非常强大的技巧是使用爱因斯坦求和:
torch.einsum('i,ij->ij', s, m)
4条答案
按热度按时间j2cgzkjk1#
您需要添加相应的单一维:
当将
(12, 10)
Tensor乘以(12, 1)
Tensor时,s[:, None]
具有(12, 1)
的大小。oyxsuwqo2#
可以将向量广播到更高维的Tensorlike so:
q43xntqr3#
如果你事先知道维度的数目,并且可以硬编码
None
的正确数目,那么Shai的答案是有效的。第一个
如果要处理可变或未知维度的数据,则可能需要手动将
mask
扩展为正确的形状这是一个有点丑陋的解决方案,但它确实有效。可能有一个更优雅的方法来正确地为可变维数内联重塑
mask
Tensor5sxhfpxr4#
一个刚开始有点难以理解,但非常强大的技巧是使用爱因斯坦求和: