Pytorch以交替顺序连接行

Pytorch以交替顺序连接行,pytorch,Pytorch,我正试图在《变形金刚》一书中对位置编码进行编码。为此,我需要执行类似以下操作: a=torch.arange(20).重塑(4,5) b=a*2 c=火炬.cat([a_行,b_行](a,b行)为a_行,b_行为拉链(a,b)]) 我觉得可能有一个更快的方法来做上述工作?也许通过在a和b上添加一个维度?我可以简单地使用赋值运算符: c=torch.zero(8,5) c[::2,:]=每隔一行一个#索引,从0开始 c[1::2,:]=b#从1开始每隔一行索引一次 在为两种解决方案计时时,我使

我正试图在《变形金刚》一书中对位置编码进行编码。为此,我需要执行类似以下操作:

a=torch.arange(20).重塑(4,5)
b=a*2
c=火炬.cat([a_行,b_行](a,b行)为a_行,b_行为拉链(a,b)])

我觉得可能有一个更快的方法来做上述工作?也许通过在a和b上添加一个维度?

我可以简单地使用赋值运算符:

c=torch.zero(8,5)
c[::2,:]=每隔一行一个#索引,从0开始
c[1::2,:]=b#从1开始每隔一行索引一次
在为两种解决方案计时时,我使用了以下方法:

import timeit
进口火炬
a=火炬。arange(20)。重塑(4,5)
b=a*2
建议=timeit.timeit(“c=torch.cat([torch.stack([a_行,b_行])用于a_行,b_行压缩(a,b)]”,
setup=“导入火炬;从主火炬导入a、b”,编号=10000)
打印(建议/10000)
#4.5105120493099096e-05
改进的=timeit.timeit(“c=torch.zero(8,5);c[::2,:]=a;c[1::2,:]=b”,
setup=“导入火炬;从主火炬导入a、b”,编号=10000)
打印(改进版/10000)
#2.1489459509029985e-05
第二种方法持续减少(大约一半)时间,即使单个迭代仍然非常快。当然,你必须测试你的实际张量大小,但这是我能想到的最简单的解决方案。 迫不及待地想看看是否有人有一些漂亮的低级解决方案,它甚至更快


另外,请记住,假设要交织的张量已经给定,我没有为
b
的创建计时。

因此,简单的串联和重塑可以实现以下目的:

c=torch.cat([a,b],dim=-1).视图(-1,a.shape[-1])
当我用以下方法计时时,它比@Denninger的答案快2.3倍:

improved2=timeit.timeit(“c=torch.cat([a,b],dim=-1.view(-1,a.shape[-1])”,
setup=“导入火炬;从主导入a、b”,
数量=10000)
印刷品(改进版2/10000)
#7.253780400003507e-06
打印(改进/改进2)
# 2.3988091506044955