如何在PyTorch中以不同偏移量移动张量中的列(或行)?

如何在PyTorch中以不同偏移量移动张量中的列(或行)?,pytorch,Pytorch,在PyTorch中,内置的torch.roll函数只能移动偏移量相同的列(或行)。但是我想用不同的偏移量来移动列。假设输入张量为 [[1,2,3], [4,5,6], [7,8,9]] 比方说,我想对第I列使用偏移量I进行移位。因此,预期输出为 [[1,8,6], [4,2,9], [7,5,3]] 这样做的一个选项是使用torch.roll和concat分别移动每一列。但是考虑到有效性和代码紧凑性,我不想引入循环结构。有更好的方法吗?让我们定义一些名称: 导入火炬 mat=火炬张量

在PyTorch中,内置的
torch.roll
函数只能移动偏移量相同的列(或行)。但是我想用不同的偏移量来移动列。假设输入张量为

[[1,2,3],
 [4,5,6],
 [7,8,9]]
比方说,我想对第I列使用偏移量
I
进行移位。因此,预期输出为

[[1,8,6],
 [4,2,9],
 [7,5,3]]

这样做的一个选项是使用
torch.roll
和concat分别移动每一列。但是考虑到有效性和代码紧凑性,我不想引入循环结构。有更好的方法吗?

让我们定义一些名称:

导入火炬
mat=火炬张量(
[[1,2,3],
[4,5,6],
[7,8,9]])
指数=火炬。LongTensor([0,1,2])#也可以在这个特定场景中使用arange
首先,你可以做一个类似的张量

[[0, 0, 0],
 [1, 1, 1],
 [2, 2, 2]]
使用

arange1=torch.arange(3).视图((3,1))。重复((1,3))
现在,让我们做一个目标指数的张量

[[0, 2, 1],
 [1, 0, 2],
 [2, 1, 0]]

arange2=(arange1-索引)%3
最后,我们得到了预期的输出

火炬聚集(垫、0、2)

感谢您提供的优质轻巧的解决方案!