Estoy usando numpy.linalg.eig para obtener una lista de autovalores y autovectores:
A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors
solution = eigenValuesAndVectors(A)
eigenValues = solution[0]
eigenVectors = solution[1]
Me gustaría ordenar mis valores propios (por ejemplo, de menor a mayor), de una manera que sepa cuál es el vector propio asociado después de la clasificación.
No encuentro ninguna forma de hacer eso con las funciones de Python. ¿Hay alguna forma sencilla o tengo que codificar mi versión de clasificación?
idx = eigenValues.argsort()[::-1]
.eigenVectors[:, eigenValues.argmax()]
La respuesta anterior de unutbu es muy clara y concisa. Pero, aquí hay otra forma en que podemos hacerlo, que es más general y también se puede usar para listas.
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)
Este tup [0] es el valor propio en función del cual la función de clasificación clasificará la lista.
reverse = False es para orden creciente.
fuente
El fragmento de código de ubuntu no funciona en mi Python 3.6.5. Conduce errores en tiempo de ejecución. Entonces, refactoricé su código a este que funciona bien en mis casos de prueba:
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)
fuente