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

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=

下面是我现在可以用火炬眼(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]])
  • 如果: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可能更好,但仅供参考,还有一个
火炬。滚动
操作符,可以沿维度移动所有内容。