2012-04-10 97 views
5

我正在使用linalg.eig(A)來獲取矩陣的特徵值和特徵向量。有沒有簡單的方法來排序這些特徵值(和相關向量)?python numpy排序特徵值

+0

可能的重複:http://stackoverflow.com/questions/8092920/sort-eigenvalues-and-associated-eigenvectors-after-using-numpy-linalg-eig-in-pyt – amcnabb 2013-05-07 17:58:10

回答

7

您想使用NumPy sort()argsort()函數。 argsort()返回數組排序需要指數的排列,所以如果你想通過特徵值大小進行排序(用於與NumPy陣列的標準排序似乎是最小的到最大的),你可以這樣做:

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

在你的第二個例子中,不需要再次調用eig_vals上的sort(),你已經有了sort_perm。即eig_vals = eig_vals [sort_perm] – user545424 2012-04-10 16:25:14

+0

好點!我不確定是否使用切片符號'[]'製作了列表的額外副本。我的想法是,他們中的至少一個可以完成,我不知道'a = a [sort_perm]'是否與'a.sort()'一樣高效。 – ely 2012-04-10 19:18:39

+0

是啊,我可以做一個基準測試併發布結果 – user545424 2012-04-10 19:57:48

-2

np.linalg.eig通常會返回複雜的值。您可能需要考慮使用np.sort_complex(eig_vals)