сортировать собственные значения и связанные с ними собственные векторы после использования numpy.linalg.eig в python

95

Я использую numpy.linalg.eig для получения списка собственных значений и собственных векторов:

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

eigenValues = solution[0]
eigenVectors = solution[1]

Я хотел бы отсортировать свои собственные значения (например, от наименьшего к наибольшему) таким образом, чтобы я знал, каков связанный собственный вектор после сортировки.

Я не нахожу никакого способа сделать это с функциями Python. Есть ли простой способ или мне нужно кодировать свою версию сортировки?

Хорхе Лейтао
источник

Ответы:

154

Используйте numpy.argsort . Он возвращает индексы, которые можно использовать для сортировки массива.

import numpy as np
import numpy.linalg as linalg

A = np.random.random((3,3))
eigenValues, eigenVectors = linalg.eig(A)

idx = eigenValues.argsort()[::-1]   
eigenValues = eigenValues[idx]
eigenVectors = eigenVectors[:,idx]

Если собственные значения комплексные, порядок сортировки является лексикографическим (то есть комплексные числа сначала сортируются в соответствии с их действительной частью, а связи разрываются по их мнимой части).

Unutbu
источник
27
Между прочим, чаще всего выполняется сортировка от наибольшего к наименьшему собственному значению. просто использовать: idx = eigenValues.argsort()[::-1].
Карл Ф.
5
чтобы получить k наибольших собственных значений k = 2 idx = eigenValues.argsort () [- k:] [:: - 1]
mrgloom
3
Для k = 1 можно использоватьeigenVectors[:, eigenValues.argmax()]
utapyngo
1
@MaxNoe: Согласно документации , «собственные значения не обязательно упорядочены».
unutbu 06
2
Ах, я использовал восемь: собственные значения в порядке возрастания, каждое повторяется в соответствии со своей кратностью.
MaxNoe
6

Приведенный выше ответ unutbu очень четкий и лаконичный. Но есть еще один способ сделать это, более общий, который также можно использовать для списков.

eval, evec =  sp.eig(A)
ev_list = zip( eval, evec )
ev_list.sort(key=lambda tup:tup[0], reverse=False)
eval, evec = zip(*ev_list)

Это tup [0] - собственное значение, на основе которого функция сортировки сортирует список.

reverse = False для увеличения порядка.

ШихарДуа
источник
1

Часть кода Ubuntu не работает на моем Python 3.6.5. Это приводит к ошибкам во время выполнения. Итак, я реорганизовал его код на этот, который нормально работает в моих тестовых примерах:

import numpy as np
from numpy import linalg as npla
#
def eigen(A):
    eigenValues, eigenVectors = npla.eig(A)
    idx = np.argsort(eigenValues)
    eigenValues = eigenValues[idx]
    eigenVectors = eigenVectors[:,idx]
    return (eigenValues, eigenVectors)
стандартный подход
источник