2012-04-10 15 views
5

Używam linalg.eig (A), aby uzyskać wartości własne i wektory własne macierzy. Czy istnieje prosty sposób sortowania tych wartości własnych (i powiązanych wektorów) w kolejności?python numpy sort wartości własne

+0

Prawdopodobny duplikat: http://stackoverflow.com/questions/8092920/sort-eigenvalues-and-associated-evevectors-after-using-numpy-linalg-eig-in-pyt – amcnabb

Odpowiedz

7

Chcesz używać funkcji NumPy sort() i argsort(). argsort() zwraca permutacji wskaźników potrzebnych do sortowania tablicy, więc jeśli chcesz, aby posortować według wartości własnej wielkości (średnia sortowania tablic numpy wydaje się być najmniejszym do największych), można zrobić:

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

W twoim drugim przykładzie, bez potrzeby ponownie wywołaj sort() na eig_vals, masz już sort_perm. tj. eig_vals = eig_vals [sort_perm] – user545424

+0

Dobra rada! Nie byłem pewien, czy użycie notacji plastra "[]" stworzyło dodatkową kopię listy. Myślałem, że przynajmniej jedno z nich może być wykonane na miejscu, i nie wiedziałem, czy 'a = a [sort_perm]' jest równie efektywne jak 'a.sort()'. – ely

+0

tak, mogę zrobić małą analizę porównawczą i opublikować wyniki – user545424

-2

np.linalg.eig często zwraca wartości zespolone. Możesz rozważyć użycie np.sort_complex(eig_vals).