如何在火炬张量中交换两行?

时间:2017-07-05 20:12:22

标签: pytorch

var = [[0, 1, -4, 8],
       [2, -3, 2, 1],
       [5, -8, 7, 1]]

var = torch.Tensor(var)

这里,var是3 x 4(2d)张量。如何交换第一行和第二行以获得以下2d张量?

2, -3, 2, 1 
0, 1, -4, 8
5, -8, 7, 1

4 个答案:

答案 0 :(得分:1)

生成您想要的排列索引:

index = torch.LongTensor([1,0,2])

应用排列:

var[index] = var

答案 1 :(得分:1)

您可以使用 index_select

>>> idx = torch.LongTensor([1,0,2])
>>> var.index_select(0, idx)

tensor([[ 2, -3,  2,  1],
        [ 0,  1, -4,  8],
        [ 5, -8,  7,  1]])

答案 2 :(得分:0)

other answer不起作用,因为某些尺寸在复制之前会被覆盖:

>>> var = [[0, 1, -4, 8],
       [2, -3, 2, 1],
       [5, -8, 7, 1]]
>>> x = torch.tensor(var)
>>> index = torch.LongTensor([1, 0, 2])
>>> x[index] = x
>>> x
tensor([[ 0,  1, -4,  8],
        [ 0,  1, -4,  8],
        [ 5, -8,  7,  1]])

对我来说,只需创建一个新的张量(具有单独的基础存储)即可保存结果:

>>> x = torch.tensor(var)
>>> index = torch.LongTensor([1, 0, 2])
>>> y = torch.zeros_like(x)
>>> y[index] = x

或者,您也可以使用(index_copy _)[https://pytorch.org/docs/stable/tensors.html#torch.Tensor.index_copy_](紧随explanation in discuss.pytorch.org之后),尽管我目前看不到这两种方法都有优势。

答案 3 :(得分:0)

其他答案表明,排列索引本身应该是张量,但这不是必需的。您可以像这样交换第一行和第二行:

>>> var
tensor([[ 0,  1, -4,  8],
        [ 2, -3,  2,  1],
        [ 5, -8,  7,  1]])

>>> var[[0, 1]] = var[[1, 0]]

>>> var
tensor([[ 2, -3,  2,  1],
        [ 0,  1, -4,  8],
        [ 5, -8,  7,  1]])

var可以是NumPy数组或PyTorch张量。