Подтвердить что ты не робот

Сортировать собственные значения и связанные с ними собственные векторы после использования 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. Есть ли какой-либо простой способ или мне нужно закодировать мою версию сортировки?

4b9b3361

Ответ 1

Используйте 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]

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

Ответ 2

Выше ответ 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 для увеличения порядка.