web-dev-qa-db-ja.com

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]

ソート後の関連する固有ベクトルが何であるかがわかるように、固有値をソートします(たとえば、最低から最高へ)。

python関数でそれを行う方法を見つけていません。簡単な方法はありますか、ソートバージョンをコーディングする必要がありますか?

67
Jorge Leitão

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]

固有値が複素数の場合、 ソート順は辞書式 (つまり、複素数は実数部から順にソートされ、虚数部でタイが分割されます)。

116
unutbu

上記の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は昇順です。

6
ShikharDua

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)
1
std.approach