Ответ 1
Попробуйте numpy.triu
(треугольник-верхний) и numpy.tril
(треугольник-нижний).
У меня есть матрица A
, и мне нужны 2 матрицы U
и L
такие, что U
содержит верхние треугольные элементы A (все элементы выше и не включая диагональ) и аналогично для L
( все элементы ниже и не включая диагональ). Есть ли способ 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.]])
Попробуйте numpy.triu
(треугольник-верхний) и numpy.tril
(треугольник-нижний).
Чтобы извлечь значения верхнего треangularьника в плоский вектор, Вы можете сделать что-то вроде следующего:
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])
Аналогично, для нижнего треangularьника используйте 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])
Используйте Процедуры создания массивов 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]])