сортировка собственных значений и связанных с ними собственных векторов после использования numpy.linalg.eig в python
Я использую numpy.linalg.eig для получения списка собственных значений и собственных векторов:
A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors
solution = eigenValuesAndVectors(A)
eigenValues = solution[0]
eigenVectors = solution[1]
Я хотел бы отсортировать мои собственные значения (например, от самого низкого до самого высокого), таким образом, я знаю, что такое связанный собственный вектор после сортировки.
Я не нахожу никакого способа сделать это с помощью функций python. Есть ли простой способ или мне нужно закодировать свою версию сортировки?
3 ответа:
использовать numpy.аргсорт. Он возвращает индексы, которые можно было бы использовать для сортировки массива.
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 очень четкий и лаконичный. Но, вот еще один способ мы можем сделать это, который более общий и может быть использован для списков, а также.
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 для увеличения порядка.
часть кода 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)