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?

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).


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.


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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.