2012-04-10 32 views
5

Ich benutze linalg.eig (A), um die Eigenwerte und Eigenvektoren einer Matrix zu erhalten. Gibt es eine einfache Möglichkeit, diese Eigenwerte (und die zugehörigen Vektoren) in der richtigen Reihenfolge zu sortieren?python numpy sort Eigenwerte

+0

Mögliche doppelte: http://stackoverflow.com/questions/8092920/sort-eigenvalues-and-associated-eigenvectors-after-using-numpy-linalg-eig-in-pyt – amcnabb

Antwort

7

Sie möchten die Funktionen NumPy sort() und argsort() verwenden. argsort() die Permutation der Indizes gibt benötigt ein Array zu sortieren, so dass, wenn Sie mit dem Eigenwert Größe (die Standard-Art scheint für NumPy Arrays kleinsten zu größten zu sein) sortieren möchten, können Sie tun:

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

In Ihrem zweiten Beispiel keine Notwendigkeit, rufe sort() erneut auf eig_vals auf, du hast bereits sort_perm. d.h. eig_vals = eig_vals [sort_perm] – user545424

+0

Guter Punkt! Ich war mir nicht sicher, ob mit der Slice-Notation '[]' eine zusätzliche Kopie der Liste erstellt wurde. Ich dachte, dass mindestens einer von ihnen an Ort und Stelle durchgeführt werden kann, und ich wusste nicht, ob 'a = a [sort_perm]' so effizient ist wie 'a.sort() '. – ely

+0

yeah, ich kann ein wenig Benchmarking machen und die Ergebnisse posten – user545424

-2

np.linalg.eig gibt oft komplexe Werte zurück. Sie können die Verwendung von np.sort_complex(eig_vals) in Betracht ziehen.