火炬 - 像numpy重复一样重复张量

时间:2016-02-05 15:02:26

标签: torch

我试图以两种方式重复火炬的张量。例如,两种方式重复张量{1,2,3,4} 3次以产生;

{1,2,3,4,1,2,3,4,1,2,3,4}
{1,1,1,2,2,2,3,3,3,4,4,4}

有一个内置的火炬:repeatTensor函数,它将生成两个中的第一个(如numpy.tile()),但我找不到后者(如numpy.repeat())。我确信我可以在第一次调用sort来给第二个但我觉得这对于更大的数组来说可能计算成本很高?

感谢。

6 个答案:

答案 0 :(得分:5)

a = torch.Tensor{1,2,3,4}

要获得{1,2,3,4,1,2,3,4,1,2,3,4},我们在第一维中重复三次张量:

a:repeatTensor(3)

要获得{1,1,1,2,2,2,3,3,3,4,4,4},我们会在张量中添加一个维度,并在第二维中重复三次以获得4 x 3张量,我们可以将其展平。

b = a:reshape(4,1):repeatTensor(1,3)
b:view(b:nElement())

答案 1 :(得分:3)

尝试torch.repeat_interleave()方法:https://pytorch.org/docs/stable/torch.html#torch.repeat_interleave

>>> x = torch.tensor([1, 2, 3])
>>> x.repeat_interleave(2)
tensor([1, 1, 2, 2, 3, 3])

答案 2 :(得分:1)

引用https://discuss.pytorch.org/t/how-to-tile-a-tensor/13853-

z = torch.FloatTensor([[1,2,3],[4,5,6],[7,8,9]])
1 2 3
4 5 6
7 8 9
z.transpose(0,1).repeat(1,3).view(-1, 3).transpose(0,1)
1 1 1 2 2 2 3 3 3
4 4 4 5 5 5 6 6 6
7 7 7 8 8 8 9 9 9

这将使您直观地了解其工作原理。

答案 3 :(得分:1)

使用einops:

from einops import repeat

repeat(x, 'i -> (repeat i)', repeat=3)
# like {1,2,3,4,1,2,3,4,1,2,3,4}

repeat(x, 'i -> (i repeat)', repeat=3)
# like {1,1,1,2,2,2,3,3,3,4,4,4}

此代码对任何框架(numpy,torch,tf等)都相同

答案 4 :(得分:0)

这是在张量中重复元素的通用函数。

foo = tensor([[1, 2],
              [3, 4]])

如果有

repeat(foo, [2,1])

通过致电tensor([[1, 2], [1, 2], [3, 4], [3, 4]]) ,您会得到

DOL_99 = GSK_GebSchad.groupby('Gefstufe').DOL_ind.quantile(0.99)

因此,您复制了维度0上的每个元素,并将元素保留在维度1上。

答案 5 :(得分:0)

您可以尝试以下方法吗?

import torch as pt

#1 work as numpy tile

b = pt.arange(10)
print(b.repeat(3))

#2 work as numpy tile

b = pt.tensor(1).repeat(10).reshape(2,-1)
print(b)

#3 work as numpy repeat

t = pt.tensor([1,2,3])
t.repeat(2).reshape(2,-1).transpose(1,0).reshape(-1)