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?
idx = eigenValues.argsort()[::-1]
.eigenVectors[:, eigenValues.argmax()]
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.
źródło
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)
źródło