2012-01-18 12 views
32

Mam matrycę A i chcę 2 macierze U i L takie, że U zawiera górne trójkątne elementy A (wszystkie elementy powyżej i bez przekątnej) i podobnie dla L (wszystkie elementy poniżej i bez przekątnej). Czy jest to metoda numpy?Wyciąg górną/dolną trójkątną część macierzy?

np

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

Odpowiedz

41

Spróbuj numpy.triu (trójkątne) i górną (numpy.tril trójkąta poniżej).

+20

Do OP: Często warto wiedzieć, że biorą również argument "k", dla którego przekątna wyodrębnia się powyżej lub poniżej (która może być _właśnie użyteczna, kiedy jej potrzebujesz!). Dodatkowo istnieją funkcje 'np.triu_indices',' np.tril_indices', 'np.triu_indices_from' oraz' np.tril_indices_from', aby wygenerować indeksy do indeksowania górnego lub dolnego trójkąta z. (Wersje "od" po prostu pobierają tablicę wejściową zamiast kształtu) –

6

Użyj Array Creation Routines z numpy.triu i numpy.tril, aby zwrócić kopię matrycy z elementami powyżej lub poniżej k-tej zerowanej przekątnej.

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

W przypadku, gdy chcesz wyodrębnić górne wartości trójkąt płaski wektora, można zrobić coś takiego:


import numpy as np 

a = np.array([[1,2,3],[4,5,6],[7,8,9]]) 

a[np.triu_indices(3)] 

#or 

list(a[np.triu_indices(3)]) 

Podobnie dla dolny trójkąt, użyj

np.tril