Sortieren Sie Eigenwerte und zugehörige Eigenvektoren nach Verwendung von numpy.linalg.eig in Python

89

Ich verwende numpy.linalg.eig, um eine Liste von Eigenwerten und Eigenvektoren zu erhalten:

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

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

Ich möchte meine Eigenwerte (z. B. vom niedrigsten zum höchsten) so sortieren, dass ich weiß, was der zugehörige Eigenvektor nach dem Sortieren ist.

Ich finde keine Möglichkeit, dies mit Python-Funktionen zu tun. Gibt es eine einfache Möglichkeit oder muss ich meine Sortierversion codieren?

Jorge Leitao
quelle

Antworten:

148

Verwenden Sie numpy.argsort . Es gibt die Indizes zurück, die zum Sortieren des Arrays verwendet werden würden.

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]

Wenn die Eigenwerte komplex sind, ist die Sortierreihenfolge lexikografisch ( dh komplexe Zahlen werden zuerst nach ihrem Realteil sortiert, wobei die Bindungen durch ihren Imaginärteil unterbrochen werden).

unutbu
quelle
25
Übrigens ist es üblicher, vom größten zum kleinsten Eigenwert zu sortieren. benutze einfach : idx = eigenValues.argsort()[::-1].
Carl F.
5
um k größte Eigenwerte zu erhalten k = 2 idx = eigenValues.argsort () [- k:] [:: - 1]
mrgloom
3
Für k = 1 kann maneigenVectors[:, eigenValues.argmax()]
utapyngo
1
@MaxNoe: Gemäß den Dokumenten "Die Eigenwerte sind nicht unbedingt geordnet."
Unutbu
2
Ah, ich habe acht verwendet: Die Eigenwerte in aufsteigender Reihenfolge, die sich jeweils nach ihrer Multiplizität wiederholen.
MaxNoe
6

Die obige Antwort von unutbu ist sehr klar und prägnant. Aber hier ist eine andere Möglichkeit, die allgemeiner ist und auch für Listen verwendet werden kann.

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)

Dieses tup [0] ist der Eigenwert, nach dem die Sortierfunktion die Liste sortiert.

reverse = False dient zur Erhöhung der Reihenfolge.

ShikharDua
quelle
1

Der Code des Ubuntu funktioniert auf meinem Python 3.6.5 nicht. Es führt zu Laufzeitfehlern. Also habe ich seinen Code in diesen Code umgestaltet, der in meinen Testfällen einwandfrei funktioniert:

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