提取numpy矩阵的上三角或下三角部分

111
我有一个矩阵A,我想要得到两个矩阵U和L。其中矩阵U包含A的上三角元素(包括对角线上的元素),矩阵L包含A的下三角元素(不包括对角线上的元素)。是否有一个numpy方法可以做到这一点?
例如:
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个回答

121

要将上三角部分的值提取为平面向量,您可以按照以下方式进行操作:

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

#array([1, 2, 3, 5, 6, 9])

同样地,对于下三角,请使用np.tril


重要提示

如果您想提取对角线上方(或下方)的值,请使用k参数。当矩阵是对称矩阵时通常使用此选项。

import numpy as np

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

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

编辑(于 2019 年 11 月 11 日):

要将提取的向量放回二维对称数组中,可以按照我在这里给出的答案操作:https://dev59.com/kGMm5IYBdhLWcg3wi_i0#58806626


15
дҪ иҝҳеҸҜд»ҘдҪҝз”Ё np.triu_indices_from(a)пјҢиҝҷж ·дҪ е°ұдёҚйңҖиҰҒжүӢеҠЁжҢҮе®ҡзҹ©йҳөзҡ„еӨ§е°ҸдәҶгҖӮ - isarandi

105

尝试使用numpy.triu(上三角)和numpy.tril(下三角)。

代码示例:

np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 0,  8,  9],
       [ 0,  0, 12]])

47
针对楼主:了解到k参数的含义通常很有用,它可以指定从主对角线上方或下方提取哪个对角线(在需要时非常有用!)。此外,还有函数np.triu_indicesnp.tril_indicesnp.triu_indices_fromnp.tril_indices_from,可生成用于索引上三角或下三角的索引。(“from”版本只需将输入数组作为参数,而不是形状) - Joe Kington

22
使用 NumPy 中的数组创建函数,以及 numpy.triunumpy.tril 函数,返回一个将矩阵第 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]])

4
如果您想用其他而不是0来填充,比如np.inf,该怎么做? - cglacet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接