将张量扩展几个维度
Expand the tensor by several dimensions
在 PyTorch 中,给定一个大小为 [3]
的张量,如何将其扩展几个维度到大小 [3,2,5,5]
,以便添加的维度具有原始张量的对应值。例如,使 [1,2,3]
使得大小为 [2,5,5]
的第一个张量具有值 1
,第二个具有所有值 2
,第三个具有所有值 [=16] =].
另外,如何将大小为[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
or torch.Tensor.view
执行多次解压缩:
>>> x.view(-1, 1, 1, 1).expand(target)
这允许使用更通用的方法来处理任意目标形状:
>>> x.view(len(x), *(1,)*(len(target)-1)).expand(target)
对于更通用的实现,其中 x
可以是 multi-dimensional:
>>> 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)
在 PyTorch 中,给定一个大小为 [3]
的张量,如何将其扩展几个维度到大小 [3,2,5,5]
,以便添加的维度具有原始张量的对应值。例如,使 [1,2,3]
使得大小为 [2,5,5]
的第一个张量具有值 1
,第二个具有所有值 2
,第三个具有所有值 [=16] =].
另外,如何将大小为[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
or torch.Tensor.view
执行多次解压缩:
>>> x.view(-1, 1, 1, 1).expand(target)
这允许使用更通用的方法来处理任意目标形状:
>>> x.view(len(x), *(1,)*(len(target)-1)).expand(target)
对于更通用的实现,其中 x
可以是 multi-dimensional:
>>> 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)