programing

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

abcjava 2023. 9. 13. 22:16
반응형

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

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는 증가하는 순서에 대한 것입니다.

우분투의 코드 조각은 내 파이썬 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)

언급URL : https://stackoverflow.com/questions/8092920/sort-eigenvalues-and-associated-eigenvectors-after-using-numpy-linalg-eig-in-pyt

반응형