如何制作对角矩阵的掩码,但从第二列开始?

How do I make a mask of diagonal matrix, but starting from the 2nd column?

这就是我现在 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]]

您可以使用 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]])
  • If :attr:diagonal = 0, it is the main diagonal.
  • If :attr:diagonal > 0, it is above the main diagonal.
  • If :attr:diagonal < 0, it is below the main diagonal.

这是另一个使用 torch.diagflat() 的解决方案,并使用正 offset 作为 shifting/moving 对角线 在主对角线 之上。

# 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]])