Pythonでnumpy.linalg.eigを使用した後、固有値と関連する固有ベクトルを並べ替えます


94

numpy.linalg.eigを使用して、固有値と固有ベクトルのリストを取得しています。

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

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

ソート後に関連付けられた固有ベクトルが何であるかがわかる方法で、固有値を(たとえば、最低から最高に)ソートしたいと思います。

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

回答:


153

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]
カールF.

5
k個の最大固有値を取得するにはk = 2 idx = eigenValues.argsort()[-k:] [::-1]
mrgloom 2014年

3
k = 1の場合、使用できますeigenVectors[:, eigenValues.argmax()]
utapyngo 2014

1
@MaxNoe:ドキュメントによると、「固有値は必ずしも順序付けられているとは限りません。」
unutbu 2017

2
ああ、私はeighを使用していました:固有値は昇順で、それぞれがその多重度に従って繰り返されました。
MaxNoe 2017

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

ubuntuのコードは私のPython3.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.