Преобразование строк в группы столбцов - PullRequest
2 голосов
/ 14 июля 2020

У меня есть несколько векторов-строк, которые я хотел бы объединить как векторы-столбцы и использовать в качестве входных данных для Conv1d. В качестве примера я хотел бы преобразовать тензор x в y, т.е. создать две группы из двух векторов-столбцов.

# size = [4, 3]
x = torch.tensor([
    [0,  1,  2],
    [3,  4,  5],
    [6,  7,  8],
    [9, 10, 11]
])
# size = [2, 3, 2]
y = torch.tensor([
    [[0,  3],
     [1,  4],
     [2,  5]],
    [[6,  9],
     [7, 10],
     [8, 11]]
])

Есть ли способ сделать это с помощью всего reshape и подобные функции? Единственный способ, который я могу придумать, - это использовать циклы и копировать в новый тензор.

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Вам нужно использовать permute, а также reshape:

x.reshape(2, 2, 3).permute(0, 2, 1)
Out[*]:
tensor([[[ 0,  3],
         [ 1,  4],
         [ 2,  5]],

        [[ 6,  9],
         [ 7, 10],
         [ 8, 11]]])

Сначала вы разбиваете векторы на 2 x.reshape(2,2,3), размещая дополнительное измерение посередине. Затем, используя permute, вы меняете порядок размеров, как вы ожидали.

1 голос
/ 14 июля 2020

Вы также можете использовать torch.split и torch.stack, например

torch.stack(x.split(2), dim=2)      # or torch.stack(x.T.split(2, dim=1))
tensor([[[ 0,  3],
         [ 1,  4],
         [ 2,  5]],

        [[ 6,  9],
         [ 7, 10],
         [ 8, 11]]])
...