Python 如何制作对角线矩阵的掩码,但从第2列开始?
下面是我现在可以用火炬眼(3,4)得到的东西 我得到的矩阵是:Python 如何制作对角线矩阵的掩码,但从第2列开始?,python,matrix,pytorch,tensor,diagonal,Python,Matrix,Pytorch,Tensor,Diagonal,下面是我现在可以用火炬眼(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, 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]])
- 如果:attr:
=0,则它是主对角线对角线
- 如果:attr:
>0,则它位于主对角线上方对角线
- 如果:attr:
<0,则它位于主对角线下方对角线
这里是另一个解决方案,使用和使用正的
偏移量
将对角线移动/移动到主对角线上方
# 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.roll谢谢,实际上我刚刚找到了一个解决方案,将一个零张量连接到
torch.eye(3)
的顶部,然后转置它。但这个可能更优雅。谢谢@灰化的diag可能更好,但仅供参考,还有一个火炬。滚动操作符,可以沿维度移动所有内容。