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


97

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

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

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

정렬 후 연관된 고유 벡터가 무엇인지 아는 방식으로 고유 값 (예 : 가장 낮은 값에서 가장 높은 값으로)을 정렬하고 싶습니다.

파이썬 함수로 그렇게하는 방법을 찾지 못했습니다. 간단한 방법이 있습니까? 아니면 정렬 버전을 코딩해야합니까?

답변:


157

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]

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


27
덧붙여서, 가장 큰 고유 값에서 가장 작은 고유 값으로 정렬하는 것이 더 일반적입니다. 그냥 사용 : idx = eigenValues.argsort()[::-1].
Carl F.

5
k 개의 가장 큰 고유 값을 얻으려면 k = 2 idx = eigenValues.argsort () [-k :] [::-1]
mrgloom

3
K = 1의 경우는 하나의 사용eigenVectors[:, eigenValues.argmax()]
utapyngo

1
@MaxNoe : 문서에 따라 "고유 값이 반드시 정렬 된 것은 아닙니다."
unutbu 2017 년

2
아, 나는 eigh를 사용하고 있었다 : 오름차순의 고유 값, 각각의 다중성에 따라 반복.
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

우분투의 코드가 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.