【问题标题】:Replace all the subdiagonals of a matrix for a given k in Python在Python中替换给定k的矩阵的所有下对角线
【发布时间】:2021-06-10 21:55:12
【问题描述】:

我想替换 k 对角线下所有对角线的值。

例如:

我们首先导入 numpy 库:

import numpy as np

然后我们创建矩阵:

In [14]: matrix = np.matrix('1 1 1 1 1 1; 1 1 1 1 1 1; 1 1 1 1 1 1; 1 1 1 1 1 1; 1 1 1 1 1 1')

然后我们得到:

In [15]: print(matrix)

Out[16]: 
    [[1 1 1 1 1 1]
     [1 1 1 1 1 1]
     [1 1 1 1 1 1]
     [1 1 1 1 1 1]
     [1 1 1 1 1 1]]

然后我们得到 k 对角线下的对角线,例如 k = 1:

In [17]: lowerdiags = [np.diag(matrix, k=e+1).tolist() for e in range(-len(matrix), k)]

In [18]: print(lowerdiags)

Out[19]: [[1], [1, 1], [1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]

而且,我被困在那里,我应该为 k = 1 添加什么并替换每个 0 的所有值,就像这样:(知道我们刚刚找到了对角线)

[[0 1 1 1 1 1]
 [0 0 1 1 1 1]
 [0 0 0 1 1 1]
 [0 0 0 0 1 1]
 [0 0 0 0 0 1]]

甚至对于 k = 0 :

[[1 1 1 1 1 1]
 [0 1 1 1 1 1]
 [0 0 1 1 1 1]
 [0 0 0 1 1 1]
 [0 0 0 0 1 1]]

感谢您的帮助和耐心。

【问题讨论】:

    标签: python arrays list matrix diagonal


    【解决方案1】:

    我通过使用 numpy 方法找到了一种方法:fill_diagonal 并在不同的 k 周围移动:

    # Import numpy library
    import numpy as np
    
    def Exercise_3(matrix, k):
        # print initial matrix
        print(matrix)
        
        for k in range(-len(matrix)+1, k):
            if k < 0:
                # Smart slicing when filling diagonals with "np.fill_diagonal" on our matrix for lower diagonals
                np.fill_diagonal(matrix[-k:, :k], 0)
            if k > 0:
                # Smart slicing when filling diagonals with "np.fill_diagonal" on our matrix for upper diagonals
                np.fill_diagonal(matrix[:-k, k:], 0)
            if k == 0:
                # Just replace the main diagonal by 0
                np.fill_diagonal(matrix, 0)
            # print to see each change on the matrix    
            #print(matrix)
            
            #print(k)
    
        return matrix
    
    def main():
        k = 0
        # an another way of creating a matrix
        #matrix = np.matrix('1 1 1 1 1 1; 1 1 1 1 1 1; 1 1 1 1 1 1; 1 1 1 1 1 1; 1 1 1 1 1 1; 1 1 1 1 1 1')
        # matrix of 5 rows and 5 columns filled by 1
        matrix = np.array(([1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1]))
        
        NewMatrix = Exercise_3(matrix, k)
        print(NewMatrix)
    
    main()
    

    【讨论】:

      猜你喜欢
      • 2021-09-16
      • 2019-05-21
      • 2023-03-25
      • 1970-01-01
      • 2019-06-26
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多