¿Cuál es la forma Pythonic de obtener una lista de elementos diagonales en una matriz que pasa por la entrada (i,j)
?
Por ejemplo, dada una matriz como:
[1 2 3 4 5]
[6 7 8 9 10]
[11 12 13 14 15]
[16 17 18 19 20]
[21 22 23 24 25]
y una entrada, por ejemplo, (1,3)
(que representa el elemento 9
) ¿cómo puedo hacer que los elementos de las diagonales pasen 9
de forma pitónica? Básicamente, [3,9,15]
y [5,9,13,17,21]
ambos.
Solución del problema
Usando np.diagonal
con un poco de lógica de compensación.
import numpy as np
lst = np.array([[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25]])
i, j = 1, 3
major = np.diagonal(lst, offset=(j - i))
print(major)
array([ 3, 9, 15])
minor = np.diagonal(np.rot90(lst), offset=-lst.shape[1] + (j + i) + 1)
print(minor)
array([ 5, 9, 13, 17, 21])
Los índices i
y j
son la fila y la columna. Al especificar el desplazamiento, numpy
sabe desde dónde comenzar a seleccionar elementos para la diagonal.
Para la diagonal mayor, desea comenzar a recopilar desde 3
la primera fila. Por lo tanto, debe tomar el índice de columna actual y restarlo por el índice de fila actual para calcular el índice de columna correcto en la fila 0. De manera similar para la diagonal menor, donde la matriz se voltea (gira 90˚) y el proceso se repite.
No hay comentarios.:
Publicar un comentario