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.]])
37
demandé sur seralouk 2012-01-18 09:13:11

3 réponses

Essayer numpy.triu (triangle-haut) et numpy.tril (triangle inférieur).

46
répondu mathematical.coffee 2012-01-18 05:15:34

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

19
répondu seralouk 2018-06-12 22:10:13

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]])
9
répondu 2016-11-02 02:52:27