sortuj wartości własne i powiązane wektory własne po użyciu numpy.linalg.eig w Pythonie

101

Używam numpy.linalg.eig, aby uzyskać listę wartości własnych i wektorów własnych:

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

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

Chciałbym posortować moje wartości własne (np. Od najniższej do najwyższej), w taki sposób, aby wiedzieć, jaki jest powiązany wektor własny po sortowaniu.

Nie znajduję żadnego sposobu, aby to zrobić z funkcjami Pythona. Czy jest jakiś prosty sposób lub czy muszę zakodować wersję sortowania?

Jorge Leitao
źródło

Odpowiedzi:

162

Użyj numpy.argsort . Zwraca indeksy, których użyłbyś do sortowania tablicy.

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]

Jeśli wartości własne są złożone, porządek sortowania jest leksykograficzny (to znaczy, liczby zespolone są najpierw sortowane według ich części rzeczywistej, z wiązaniami przerywanymi przez część urojoną).

unutbu
źródło
27
Nawiasem mówiąc, bardziej powszechne jest sortowanie od największej do najmniejszej wartości własnej. Wystarczy użyć: idx = eigenValues.argsort()[::-1].
Carl F.
5
aby uzyskać k największych wartości własnych k = 2 idx = eigenValues.argsort () [- k:] [:: - 1]
mrgloom
3
Dla k = 1 można użyćeigenVectors[:, eigenValues.argmax()]
utapyngo
1
@MaxNoe: Zgodnie z dokumentacją , „Wartości własne niekoniecznie są uporządkowane”.
unutbu
2
Ach, użyłem ósemki: wartości własne w porządku rosnącym, każda powtórzona zgodnie z jej wielokrotnością.
MaxNoe
6

Powyższa odpowiedź unutbu jest bardzo zwięzła i zwięzła. Ale oto inny sposób, w jaki możemy to zrobić, który jest bardziej ogólny i może być również użyty w przypadku list.

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)

Ta tupa [0] jest wartością własną, na podstawie której funkcja sortowania posortuje listę.

reverse = False służy do zwiększania porządku.

ShikharDua
źródło
2

Fragment kodu Ubuntu nie działa na moim Pythonie 3.6.5. Prowadzi to do błędów w czasie wykonywania. Więc refaktoryzowałem jego kod na ten, który działa dobrze na moich przypadkach testowych:

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
źródło