Извлечь верхнюю или нижнюю треугольную часть матовой матрицы - PullRequest
48 голосов
/ 18 января 2012

У меня есть матрица 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.]])

Ответы [ 3 ]

55 голосов
/ 18 января 2012

Попробуйте numpy.triu (верхний треугольник) и numpy.tril (нижний треугольник).

30 голосов
/ 06 июня 2017

Чтобы извлечь значения верхнего треугольника в плоский вектор, вы можете сделать что-то вроде следующего:

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

13 голосов
/ 02 ноября 2016

Используйте Процедуры создания массива из 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]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...