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

pra*_*km 50 python numpy

我有一个矩阵A,我想2点矩阵UL使得U包含A的上三角形单元(上述所有的元素和不包括对角线)同样地,对于L(下面所有的元素和不包括对角线).有没有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.]])
Run Code Online (Sandbox Code Playgroud)

mat*_*fee 59

尝试numpy.triu(三角形 - 上部)和numpy.tril(三角形 - 下部).

  • 对于OP:通常有用的是知道它们也采用了一个`k`参数,对于要在上面或下面提取的对角线(当你需要时它可以是_really_有用!).此外,还有函数`np.triu_indices`,`np.tril_indices`,`np.triu_indices_from`和`np.tril_indices_from`来生成用于索引上三角或下三角的索引.("from"版本只采用输入数组而不是形状) (27认同)

mak*_*kis 35

要将上三角形值提取到平面矢量,您可以执行以下操作:

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])
Run Code Online (Sandbox Code Playgroud)

同样,对于下三角形,请使用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])
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用“np.triu_indices_from(a)”,因此不需要手动指定矩阵的大小。 (7认同)
  • 简洁易懂。很好的答案! (3认同)

小智 13

使用数组创建例程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]])
Run Code Online (Sandbox Code Playgroud)

  • 例如,您将如何填充“0”以外的其他内容,例如“np.inf”行? (4认同)