Как сделать маску из диагональной матрицы, но начиная со 2-го столбца? - PullRequest
2 голосов
/ 17 января 2020

Итак, вот что я могу получить с torch.eye(3,4) сейчас

Матрица, которую я получаю:

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

Есть ли какой-нибудь (простой) способ преобразовать его или сделать такой маска в этом формате:

Матрица, которую я хочу:

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

Ответы [ 2 ]

1 голос
/ 18 января 2020

Вот еще одно решение, использующее torch.diagflat() и положительное значение offset для смещения / перемещения диагонали над главной диагональю .

# diagonal values to fill
In [253]: diagonal_vals = torch.ones(3, dtype=torch.long)  

# desired tensor but ...
In [254]: torch.diagflat(diagonal_vals, offset=1) 
Out[254]: 
tensor([[0, 1, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, 1],
        [0, 0, 0, 0]])

Приведенная выше операция дает нам квадратную матрицу; однако нам нужна неквадратная матрица формы (3,4). Итак, мы просто проигнорируем последнюю строку с простым индексированием:

# shape (3, 4) with 1's above the main diagonal
In [255]: torch.diagflat(diagonal_vals, offset=1)[:-1] 
Out[255]: 
tensor([[0, 1, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, 1]])
1 голос
/ 18 января 2020

Вы можете сделать это, используя torch.diagonal и указав необходимую диагональ:

>>> torch.diag(torch.tensor([1,1,1]), diagonal=1)[:-1]

tensor([[0, 1, 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, 1]])
  • Если: attr: diagonal = 0, это главная диагональ.
  • Если: attr: diagonal> 0, он выше главной диагонали.
  • Если: attr: diagonal <0, он ниже главной диагонали. </li>
...