在Python中替换给定k的矩阵的所有子对角线

在Python中替换给定k的矩阵的所有子对角线,python,arrays,list,matrix,diagonal,Python,Arrays,List,Matrix,Diagonal,我想替换k-对角线下的所有次对角线值 例如: 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]] 我们首先导入numpy库: import numpy

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

例如:

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]]
我们首先导入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=1时k-对角线下的对角线,例如:

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的所有值,就像这样:(知道我们刚刚找到了子对角线)

甚至对于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]]

感谢您的帮助和耐心。

我找到了一种方法,使用numpy方法:填充对角线,并在不同的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()
#导入numpy库
将numpy作为np导入
def练习3(矩阵,k):
#打印初始矩阵
打印(矩阵)
对于范围内的k(-len(矩阵)+1,k):
如果k<0:
#在我们的下对角线矩阵上用“np.fill_diagonal”填充对角线时进行智能切片
np.fill_对角线(矩阵[-k:,:k],0)
如果k>0:
#在上对角线矩阵上用“np.fill_diagonal”填充对角线时进行智能切片
np.fill_对角线(矩阵[:-k,k:],0)
如果k==0:
#只需将主对角线替换为0
np.填充_对角线(矩阵,0)
#打印以查看矩阵上的每个更改
#打印(矩阵)
#印刷品(k)
返回矩阵
def main():
k=0
#创建矩阵的另一种方法
#矩阵=np.矩阵('11;11;11;11;11;11;11;11;11;11;11;11;11;11;11')
#由5行5列组成的矩阵,由1填充
矩阵=np.数组([1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1],[1,1,1,1]))
NewMatrix=练习3(矩阵,k)
打印(新矩阵)
main()