我有一个矩阵A
,我需要2个矩阵U
和L
,以便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.]])
答案 0 :(得分:53)
尝试numpy.triu
(三角形 - 上部)和numpy.tril
(三角形 - 下部)。
答案 1 :(得分:27)
要将上三角值提取到平面矢量, 你可以做以下的事情:
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])
答案 2 :(得分:13)
使用Array Creation Routines的numpy.triu和numpy.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]])