在 PyTorch 中,给定一个长度为
n
的张量(向量),如何通过几个维度扩展它,将张量中的每个条目增加和复制到这些维度?例如,给定一个大小为 [3]
的张量,将其扩展为 size=[3,2,5,5]
,这样添加的维度具有与原始张量对应的值。在这种情况下,让大小=[3]
和向量=[1,2,3]
使得大小为[2,5,5]
的第一个张量具有值1
,第二个具有所有值2
,第三个具有所有值3
.
另外,如何将大小为
[3,2]
的向量展开为[3,2,5,5]
?
我能想到的一种方法是先用 ones-Like 和 einsum 创建一个相同大小的向量,但我认为应该有更简单的方法。
torch.Tensor.expand
扩展到目标形状的视图:
>>> x = torch.rand(3)
>>> target = [3,2,5,5]
>>> x[:, None, None, None].expand(target)
torch.Tensor.reshape
或 torch.Tensor.view
执行多次解压:
>>> x.view(-1, 1, 1, 1).expand(target)
这允许使用更通用的方法来处理任意目标形状:
>>> x.view(len(x), *(1,)*(len(target)-1)).expand(target)
对于更一般的实现,其中
x
可以是多维的:
>>> x = torch.rand(3, 2)
# just to make sure the target shape is valid w.r.t to x
>>> assert list(x.shape) == list(target[:x.ndim])
>>> x.view(*x.shape, *(1,)*(len(target)-x.ndim)).expand(target)