我正在尝试从3d张量向每个2d张量添加2d张量。
假设我有一个a
形状的张量(2,3,2)
和一个b
形状的张量(2,2)
。
a = [[[1,2],
[1,2],
[1,2]],
[[3,4],
[3,4],
[3,4]]]
b = [[1,2], [3,4]]
#the result i want to get
a[:, 0, :] + b
a[:, 1, :] + b
a[:, 2, :] + b
我想知道pytorch中是否有一种方法可以做到这一点。
答案 0 :(得分:2)
最有效的方法是在b
上添加额外的第二维,然后使用广播添加:
a = torch.Tensor([[[1,2],[1,2],[1,2]],[[3,4],[3,4],[3,4]]])
b = torch.Tensor([[1,2],[3,4]])
a += b.unsqueeze(1)
答案 1 :(得分:0)
您想做什么:
a = [[[1,2],
[1,2],
[1,2]],
[[3,4],
[3,4],
[3,4]]]
b = [[1,2], [3,4]]
a = torch.LongTensor(a)
b = torch.LongTensor(b)
a[:, 0, :] += b
a[:, 1, :] += b
a[:, 2, :] += b
print(a)
输出:
tensor([[[2, 4],
[2, 4],
[2, 4]],
[[6, 8],
[6, 8],
[6, 8]]])
您可以执行以下相同操作。
a = (a.transpose(0, 1) + b).transpose(0, 1)
print(a) # prints the same tensor
答案 2 :(得分:0)
@SinaAfrooze提出的解决方案是正确的,但它不是最快的。
TL; DR:torch.add(b.unsqueeze(1), a)
更快。
基准:
import torch
a = torch.Tensor([[[1,2],[1,2],[1,2]],[[3,4],[3,4],[3,4]]])
b = torch.Tensor([[1,2],[3,4]])
z = a + b.unsqueeze(1)
%timeit k = torch.add(b.unsqueeze(1), a)
4.08 µs ± 25.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit z = a + b.unsqueeze(1)
4.14 µs ± 29 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
torch.equal(k, z)
True