首先,从大体的功能上来看,两者均是相同的,能够按照一定维度对张量进行复制,但细微上还是有一定差距。
torch.tile
-
参数更灵活:类似 NumPy 中的
tile
,允许传入的重复因子数量与原始张量维度数不一致。如果重复因子多于张量维度,PyTorch 会先在张量前面添加额外的维度,再执行复制。 -
作用:实现与 NumPy
tile
类似的行为,使得对新维度的扩展变得更加直观。例如,一个一维张量[1, 2, 3]
,调用tile(2, 3)
会将其先扩展为二维(在最前面添加一维),再沿着每个维度复制,得到的结果形状为(2, 9)
(具体形状依赖于输入张量和传入的参数)。
import torch
x = torch.Tensor([1,2,3])
y = torch.tile(x,dims=(2,3))
print(y,y.shape)
运行结果:
tensor([[1., 2., 3., 1., 2., 3., 1., 2., 3.],
[1., 2., 3., 1., 2., 3., 1., 2., 3.]]) torch.Size([2, 9])
.repeat方法
-
参数数量:要求传入的重复因子数量与张量的维度数一致。例如,一个 shape 为
(3, 4)
的张量,使用repeat(2, 3)
后,会在第一维重复 2 次,第二维重复 3 次,最终得到 shape(3*2, 4*3)
即(6, 12)
。 -
作用:直接在每个已有维度上复制数据。
-
注意:如果想对部分维度不重复,可以用 1 表示(例如:
repeat(1, 3)
)。
import torch
x = torch.randint(0,12,(3,4))
y = x.repeat((3,4))
print(y,y.shape)
运行结果:
tensor([[ 9, 6, 0, 6, 9, 6, 0, 6, 9, 6, 0, 6, 9, 6, 0, 6],
[ 0, 2, 0, 3, 0, 2, 0, 3, 0, 2, 0, 3, 0, 2, 0, 3],
[ 1, 2, 1, 10, 1, 2, 1, 10, 1, 2, 1, 10, 1, 2, 1, 10],
[ 9, 6, 0, 6, 9, 6, 0, 6, 9, 6, 0, 6, 9, 6, 0, 6],
[ 0, 2, 0, 3, 0, 2, 0, 3, 0, 2, 0, 3, 0, 2, 0, 3],
[ 1, 2, 1, 10, 1, 2, 1, 10, 1, 2, 1, 10, 1, 2, 1, 10],
[ 9, 6, 0, 6, 9, 6, 0, 6, 9, 6, 0, 6, 9, 6, 0, 6],
[ 0, 2, 0, 3, 0, 2, 0, 3, 0, 2, 0, 3, 0, 2, 0, 3],
[ 1, 2, 1, 10, 1, 2, 1, 10, 1, 2, 1, 10, 1, 2, 1, 10]]) torch.Size([9, 16])