2012-01-18 91 views
32

Tôi có ma trận A và tôi muốn 2 ma trận UL sao cho U chứa các phần tử hình tam giác trên của A (tất cả các phần trên và không bao gồm đường chéo) và tương tự cho L (tất cả các phần tử bên dưới và không bao gồm đường chéo). Có phương pháp numpy để thực hiện việc này không?trích xuất phần hình tam giác trên/dưới của một ma trận sần?

ví dụ

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

Trả lời

41

Hãy thử numpy.triu (tam giác phía trên) và numpy.tril (tam giác thấp hơn).

+20

Đối với OP: Thường hữu ích khi biết rằng họ cũng có tham số 'k', để đường chéo trích xuất ở trên hoặc dưới (có thể là _really_ hữu ích khi bạn cần!). Ngoài ra, có các hàm 'np.triu_indices',' np.tril_indices', 'np.triu_indices_from' và' np.tril_indices_from' để tạo chỉ mục để lập chỉ mục tam giác trên hoặc dưới. (Các phiên bản "từ" chỉ lấy một mảng đầu vào thay vì một hình dạng) –

6

Sử dụng Array Creation Routines của numpy.triunumpy.tril để trả lại bản sao của ma trận có các phần tử ở trên hoặc dưới đường chéo thứ k bằng không.

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

Trong trường hợp mà bạn muốn trích xuất các giá trị tam giác trên để một vector phẳng, bạn có thể làm một cái gì đó như:


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

Tương tự như vậy, đối với các tam giác dưới, sử dụng

np.tril

Các vấn đề liên quan