Вот еще одно решение, использующее 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]])