Numpy.linalg.eigを使用して、固有値と固有ベクトルのリストを取得しています。
A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors
solution = eigenValuesAndVectors(A)
eigenValues = solution[0]
eigenVectors = solution[1]
ソート後の関連する固有ベクトルが何であるかがわかるように、固有値をソートします(たとえば、最低から最高へ)。
python関数でそれを行う方法を見つけていません。簡単な方法はありますか、ソートバージョンをコーディングする必要がありますか?
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は昇順です。
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)