我试图以两种方式重复火炬的张量。例如,两种方式重复张量{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来给第二个但我觉得这对于更大的数组来说可能计算成本很高?
感谢。
答案 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)