如何在不使用显式循环重组 Pytorch 中的张量行的情况下生成 [0,2,4,1,3,5] 之类的索引?
How to generate indices like [0,2,4,1,3,5] without using explicit loop for reorganizing rows of a tensors in Pytorch?
假设我有一个像
这样的张量
a = torch.tensor([[3, 1, 5, 0, 4, 2],
[2, 1, 3, 4, 5, 0],
[0, 4, 5, 1, 2, 3],
[3, 1, 4, 5, 0, 2],
[3, 5, 4, 2, 0, 1],
[5, 3, 0, 4, 1, 2]])
我想通过应用变换 a[c]
where
来重新组织张量的行
c = torch.tensor([0,2,4,1,3,5])
得到
b = torch.tensor([[3, 1, 5, 0, 4, 2],
[0, 4, 5, 1, 2, 3],
[3, 5, 4, 2, 0, 1],
[2, 1, 3, 4, 5, 0],
[3, 1, 4, 5, 0, 2],
[5, 3, 0, 4, 1, 2]])
为了做到这一点,我想生成张量 c
这样我就可以进行这个转换,而不管张量 a 的大小和步长大小(我在这里取等于 2为简单起见的示例)。谁能告诉我如何在 PyTorch 中不使用显式 for 循环的情况下为一般情况生成这样的张量?
想了一会儿,我想到了以下生成索引的解决方案
step = 2
idx = torch.arange(0,a.size(0),step)
# idx = tensor([0, 2, 4])
idx = idx.repeat(int(a.size(0)/idx.size(0)))
# idx = tensor([0, 2, 4, 0, 2, 4])
incr = torch.arange(0,step)
# incr = tensor([0, 1])
incr = incr.repeat_interleave(int(a.size(0)/incr.size(0)))
# incr = tensor([0, 0, 0, 1, 1, 1])
c = incr + idx
# c = tensor([0, 2, 4, 1, 3, 5])
这之后张量c
可以通过使用
得到张量b
b = a[c.long()]
我也想出了另外一个方案,解决了上面重组张量a
的行生成张量b
而不生成索引数组c
[=14]的问题=]
step = 2
b = a.view(-1,step,a.size(-1)).transpose(0,1).reshape(-1,a.size(-1))
可以使用torch.index_select,所以:
b = torch.index_select(a, 0, c)
官方文档解释的很清楚
假设我有一个像
这样的张量a = torch.tensor([[3, 1, 5, 0, 4, 2],
[2, 1, 3, 4, 5, 0],
[0, 4, 5, 1, 2, 3],
[3, 1, 4, 5, 0, 2],
[3, 5, 4, 2, 0, 1],
[5, 3, 0, 4, 1, 2]])
我想通过应用变换 a[c]
where
c = torch.tensor([0,2,4,1,3,5])
得到
b = torch.tensor([[3, 1, 5, 0, 4, 2],
[0, 4, 5, 1, 2, 3],
[3, 5, 4, 2, 0, 1],
[2, 1, 3, 4, 5, 0],
[3, 1, 4, 5, 0, 2],
[5, 3, 0, 4, 1, 2]])
为了做到这一点,我想生成张量 c
这样我就可以进行这个转换,而不管张量 a 的大小和步长大小(我在这里取等于 2为简单起见的示例)。谁能告诉我如何在 PyTorch 中不使用显式 for 循环的情况下为一般情况生成这样的张量?
想了一会儿,我想到了以下生成索引的解决方案
step = 2
idx = torch.arange(0,a.size(0),step)
# idx = tensor([0, 2, 4])
idx = idx.repeat(int(a.size(0)/idx.size(0)))
# idx = tensor([0, 2, 4, 0, 2, 4])
incr = torch.arange(0,step)
# incr = tensor([0, 1])
incr = incr.repeat_interleave(int(a.size(0)/incr.size(0)))
# incr = tensor([0, 0, 0, 1, 1, 1])
c = incr + idx
# c = tensor([0, 2, 4, 1, 3, 5])
这之后张量c
可以通过使用
b
b = a[c.long()]
我也想出了另外一个方案,解决了上面重组张量a
的行生成张量b
而不生成索引数组c
[=14]的问题=]
step = 2
b = a.view(-1,step,a.size(-1)).transpose(0,1).reshape(-1,a.size(-1))
可以使用torch.index_select,所以:
b = torch.index_select(a, 0, c)
官方文档解释的很清楚