如何制作对角矩阵的掩码,但从第二列开始?
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]])
这就是我现在 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]])