Extraire la partie triangulaire supérieure ou inférieure d'une matrice numpy
J'ai une matrice A
et je veux 2 matrices U
et L
telles que U
contient les éléments triangulaires supérieurs de A (tous les éléments ci-dessus et sans diagonale) et de même pour L
(Tous les éléments ci-dessous et sans diagonale). Existe-t-il une méthode numpy
pour le faire?
Par exemple
A = array([[ 4., 9., -3.],
[ 2., 4., -2.],
[-2., -3., 7.]])
U = array([[ 0., 9., -3.],
[ 0., 0., -2.],
[ 0., 0., 0.]])
L = array([[ 0., 0., 0.],
[ 2., 0., 0.],
[-2., -3., 0.]])
3 réponses
Essayer numpy.triu
(triangle-haut) et numpy.tril
(triangle inférieur).
Pour extraire les valeurs du triangle supérieur dans un vecteur plat, vous pouvez faire quelque chose comme ceci:
import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a)
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
a[np.triu_indices(3)]
#or
list(a[np.triu_indices(3)])
De même, pour le triangle inférieur , Utilisez
np.tril
IMPORTANT
Si vous souhaitez extraire les valeurs qui sont au-dessus de la diagonale (ou ci-dessous) puis utiliser le k argument. Ceci est généralement utilisé lorsque la matrice est symétrique.
Exemple:
import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
a[np.triu_indices(3, k = 1)]
# this returns the following
array([2, 3, 6])
Utilisez les Routines de création de Tableau de numpy.triu et numpy.tril {[3] } Pour renvoyer une copie d'une matrice avec les éléments au-dessus ou au-dessous de la k-ème diagonale mise à zéro.
>>> a = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> tri_upper_diag = np.triu(a, k=0)
>>> tri_upper_diag
array([[1, 2, 3],
[0, 5, 6],
[0, 0, 9]])
>>> tri_upper_no_diag = np.triu(a, k=1)
>>> tri_upper_no_diag
array([[0, 2, 3],
[0, 0, 6],
[0, 0, 0]])
>>> tri_lower_diag = np.tril(a, k=0)
>>> tri_lower_diag
array([[1, 0, 0],
[4, 5, 0],
[7, 8, 9]])
>>> tri_lower_no_diag = np.tril(a, k=-1)
>>> tri_lower_no_diag
array([[0, 0, 0],
[4, 0, 0],
[7, 8, 0]])