сортировать собственные значения и ассоциированные собственные векторы после использования numpy.linalg.eig в python - PullRequest
66 голосов
/ 11 ноября 2011

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

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

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

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

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

Ответы [ 3 ]

113 голосов
/ 11 ноября 2011

Использование 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]

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

5 голосов
/ 12 октября 2013

Приведенный выше ответ от 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)

Это значение [0] является собственным значением, на основе которого функция сортировки будет сортировать список.

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

1 голос
/ 28 мая 2018

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