2012-01-18 1787 views
32

我具有矩阵A和欲2点矩阵UL使得U包含A对L上三角元件(以上所有的元素和不包括对角),同样(下面的所有元素和不包括对角线)。有没有一个numpy方法来做到这一点?提取numpy矩阵的上/下三角部分?

e.g

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

回答

41

numpy.triu尝试(三角形上)和numpy.tril(三角形更低)。

+20

对于OP:知道他们也采用'k'参数常常是有用的,对于哪个对角线可以提取上面或下面(当你需要时它可能非常有用!)。此外,还有函数'np.triu_indices','np.tril_indices','np.triu_indices_from'和'np.tril_indices_from'来生成索引来索引上或下三角形。 (“来自”版本只是输入数组而不是形状) – 2012-01-18 05:17:39

6

使用numpy.triunumpy.trilArray Creation Routines返回具有高于或低于第k个对角线归零的元素的矩阵的副本。

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

如果要提取上三角值到一个平面向量, 你可以这样做:


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

同样,对于下三角形,使用

np.tril