Python 我如何折叠一个我用PyTorch展开的有重叠的张量?

Python 我如何折叠一个我用PyTorch展开的有重叠的张量?,python,pytorch,tensor,Python,Pytorch,Tensor,我有一个大小的张量:torch.size([163840]),然后展开: inp_unfolded = inp_seq.unfold(1, 160, 80) 这给了我一个形状:torch.Size([1797160]) 我如何将其重新折叠,以得到一个火炬大小([163840])?对于该特定配置,由于63840可被160整除,步长是切片大小的倍数,您只需选择该维度上的每一个第二个元素,然后选择得到的张量: inp_展开[:,::2,:]展平(1,2) 更一般地说,对于t.unfold(i,n,

我有一个大小的张量:
torch.size([163840])
,然后展开:

inp_unfolded = inp_seq.unfold(1, 160, 80)
这给了我一个形状:
torch.Size([1797160])


我如何将其重新折叠,以得到一个
火炬大小([163840])

对于该特定配置,由于
63840
可被
160
整除,步长是切片大小的倍数,您只需选择该维度上的每一个第二个元素,然后选择得到的张量:

inp_展开[:,::2,:]展平(1,2)
更一般地说,对于
t.unfold(i,n,s)
,如果
t.shape[i]%n==0且n%s==0保持不变,则可以通过以下方式恢复原始张量:

index=[t.shape中的u u的切片(无)]
索引[i]=切片(无,无,n//s)
原始=t.展开(i,n,s)[元组(索引)].展平(i,i+1)
当然,如果事先知道维度
i
,也可以使用切片表示法。例如,
i==1
,如您的示例所示:

original=t.unfold(1,n,s)[:,::n//s,…]展平(1,2)

实际上,给定的条件是:

  • n>=s
    (否则步骤将跳过一些原始数据,我们无法还原)
  • n+s>x=torch.arange(1,18)
    >>p=x.0(0,5,2)
    >>滚动(p,5,2,0)
    张量([1,2,3,4,5,6,7,8,9,10,11,12,13,14,。,
    15., 16., 17.])
    
    你也可以试着用它

    x=torch.arange(1,18)。重塑(1,17)
    
    和轴1