2012-04-10 58 views
5

Estoy usando linalg.eig (A) para obtener los valores propios y vectores propios de una matriz. ¿Hay una forma fácil de ordenar estos valores propios (y vectores asociados) en orden?python numpy ordenar valores propios

+0

Posible duplicado: http://stackoverflow.com/questions/8092920/sort-eigenvalues-and-associated-eigenvectors-after-using-numpy-linalg-eig-in-pyt – amcnabb

Respuesta

7

Desea utilizar las funciones NumPy sort() y argsort(). argsort() devuelve la permutación de los índices necesarios para ordenar una matriz, por lo que si desea ordenar la magnitud de valor propio (el tipo estándar para matrices NumPy parece ser más pequeño a más grande), que puede hacer:

import numpy as np 

A = np.asarray([[1,2,3],[4,5,6],[7,8,9]]) 
eig_vals, eig_vecs = np.linalg.eig(A) 

eig_vals_sorted = np.sort(eig_vals) 
eig_vecs_sorted = eig_vecs[:, eig_vals.argsort()] 


# Alternatively, to avoid making new arrays 
# do this: 

sort_perm = eig_vals.argsort() 

eig_vals.sort()  # <-- This sorts the list in place. 
eig_vecs = eig_vecs[:, sort_perm] 
+7

En su segundo ejemplo, no es necesario call sort() en eig_vals nuevamente, ya tiene sort_perm. es decir eig_vals = eig_vals [sort_perm] – user545424

+0

¡Buen punto! No estaba seguro de si el uso de la notación de división '[]' hizo una copia extra de la lista. Mi pensamiento era que al menos uno de ellos se puede hacer en su lugar, y no sabía si 'a = a [sort_perm]' es tan eficiente como 'a.sort()'. – ely

+0

Sí, puedo hacer una pequeña evaluación comparativa y publicar los resultados – user545424

-2

np.linalg.eig a menudo devolverá valores complejos. Es posible que desee considerar el uso de np.sort_complex(eig_vals).

Cuestiones relacionadas