Как преобразовать тензор pytorch для просмотра, такого как ((value0, row0, column0), (value1, row0, column1) …)?

#python #pytorch

#python #pytorch

Вопрос:

Как мне преобразовать тензор PyTorch для просмотра, такого как ((value0, row0, column0), (value1, row0, column1)...) ? Например, если у меня есть тензор

 a = torch.tensor([[5, 7],
                  [9, 11]])
  

Функция должна возвращать:
((5, 0, 0), (7, 0, 1), (9, 1, 0), (11, 1, 1)) . Кроме того, я хочу, чтобы эта функция применялась для констант, 1D, 3D, 4D и т. Д. тензоров, например, Для 3D я хочу, чтобы он выводил (value0, dim1, dim2, dim3).
Я пытался использовать циклы for, но не понял, как их использовать для этой задачи: я могу создать функцию только для постоянного числа измерений, например, только для 2D.

Ответ №1:

добро пожаловать в StackOverflow! Если предполагается, что ваш тензор содержит только ненулевые значения, то, я думаю, самый простой способ — использовать to_sparse :

 a = torch.tensor([[5, 7], [9, 11]])
def coords(t):
    sp_t = t.to_sparse()
    idx = sp_t.indices().T
    vals = sp_t.values()
    return torch.cat([vals.view(-1,1), idx],1)
coords(a)
>>> tensor([[ 5,  0,  0],
    [ 7,  0,  1],
    [ 9,  1,  0],
    [11,  1,  1]])
  

Если это невозможно предположить, пожалуйста, скажите мне, обходной путь с repeat и repeat_interleave должен быть возможен