【问题标题】:How to change the values of the diagonal of a matrix in numpy? [duplicate]如何在numpy中更改矩阵对角线的值? [复制]
【发布时间】:2019-05-01 18:31:00
【问题描述】:

我想将一些numpy 矩阵的对角线设置为任意一维数组。

例如,如果:

mat = np.array([[1,2],[3,4]])
diag = np.array([5,6])

然后:

>>> set_diagonal(mat, diag)
>>> mat
... array([[5,2],
           [3,6]])

可以diag 变量、diag_fillmat 矩阵到0 创建一个对角矩阵并将结果相加。但是,如果我试图改变对角线,这似乎会使用一堆不必要的资源。

如何在numpy中设置矩阵的对角线?

注意:这不是this question 的副本,因为他们想将对角线设置为常量

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您正在寻找numpy.fill_diagonal

    根据文档:

    numpy.fill_diagonal(a, val, wrap=False) .
    填充任意维度给定数组的主对角线。

    import numpy as np
    mat = np.array([[1,2],[3,4]])
    
    np.fill_diagonal(mat, [5,6])
    print(mat)
    #[[5 2]
    # [3 6]]
    

    或者

    import numpy as np
    mat = np.array([[1,2],[3,4]])
    diag = np.array([5,6])
    np.fill_diagonal(mat, diag)
    print(mat)
    #[[5 2]
    # [3 6]]
    

    【讨论】:

    • 嗯。 “val : scalar”...这似乎表明这行不通...但确实如此。所以val 参数不必是标量。
    • 有趣,我没有读到那个小字!但不知何故它起作用了哈哈!如果这对您有帮助,您能否将我的答案标记为已接受@Scott :)
    • 您可以在implementation 中看到它是如何工作的 - 它最终只是将val 分配给数组的一个切片,因此如果val 是一个大小合适的一维数组,它就可以工作.如果它是记录在案的行为会很好!
    【解决方案2】:

    您可以将该一维数组传递给fill_diagonal

    np.fill_diagonal(mat, [5,6])
    

    【讨论】:

      【解决方案3】:

      使用fill_diagonal 的答案更加优雅且计算效率更高,但您也可以访问对角线索引然后更改它们:

      mat = np.array([[1,2],[3,4]])
      diag = np.array([5,6])
      
      row, col = np.diag_indices(mat.shape[0])
      
      mat[row, col] = diag
      

      更多信息请见here

      【讨论】:

        猜你喜欢
        • 2012-04-15
        • 1970-01-01
        • 2019-08-18
        • 1970-01-01
        • 2018-01-18
        • 1970-01-01
        • 1970-01-01
        • 2021-09-10
        • 2013-08-04
        相关资源
        最近更新 更多