【问题标题】:How do I make a mask of diagonal matrix, but starting from the 2nd column?如何制作对角矩阵的掩码,但从第二列开始?
【发布时间】:2020-01-17 20:48:16
【问题描述】:

这就是我现在可以通过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.roll

标签: python matrix pytorch tensor diagonal


【解决方案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:diagonal = 0,就是主对角线。
  • 如果:attr:diagonal > 0,则在主对角线上方。
  • 如果:attr:diagonal

【讨论】:

  • 谢谢,实际上我刚刚找到了一个解决方案,将一个零张量连接到 torch.eye(3) 的顶部,然后转置它。但这一个可能更优雅。谢谢!
  • @ashered diag 可能更好,但仅供参考,还有一个 torch.roll 运算符可以沿维度移动所有内容。
【解决方案2】:

这是另一种解决方案,使用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]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    相关资源
    最近更新 更多