[python] 파이썬에서 numpy.linalg.eig를 사용한 후 고유 값 및 관련 고유 벡터 정렬

numpy.linalg.eig를 사용하여 고유 값 및 고유 벡터 목록을 얻습니다.

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

eigenValues = solution[0]
eigenVectors = solution[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]

고유 값이 복잡한 경우 정렬 순서는 사전 식입니다 (즉, 복소수는 먼저 실수 부분에 따라 정렬되고 허수 부분에 의해 연결이 끊어짐).


답변

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는 오름차순입니다.


답변

우분투의 코드가 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)


답변