Me gustaría reemplazar todos los valores de las subdiagonales debajo de la k-diagonal.

Por ejemplo:

Primero importamos la biblioteca numpy:

import numpy as np

Luego creamos la matriz:

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')

Entonces estamos obteniendo:

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]]

Luego obtenemos las diagonales debajo de la diagonal k para k = 1, por ejemplo:

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]]

Y, estoy atrapado allí, ¿qué debo agregar para que sea para k = 1 y reemplazar todos los valores por 0, así: (Sabiendo que acabamos de encontrar las subdiagonales)

[[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]]

O incluso para 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]]

Gracias por tu ayuda y tu paciencia.

0
LuckyFr 13 mar. 2021 a las 00:23

1 respuesta

La mejor respuesta

Encontré una manera usando el método numpy: fill_diagonal y moviéndome alrededor de los diferentes 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()
0
LuckyFr 13 mar. 2021 a las 22:18