2012-04-10 35 views
5

Tôi đang sử dụng linalg.eig (A) để lấy các giá trị riêng và các giá trị riêng của ma trận. Có cách nào dễ dàng để sắp xếp các giá trị riêng này (và các vector liên quan) theo thứ tự không?python numpy sort eigenvalues ​​

+0

Có thể trùng lặp: http://stackoverflow.com/questions/8092920/sort-eigenvalues-and-associated-eigenvectors-after-using-numpy-linalg-eig-in-pyt – amcnabb

Trả lời

7

Bạn muốn sử dụng các chức năng NumPy sort()argsort(). argsort() trả về hoán vị của các chỉ số cần thiết để sắp xếp một mảng, vì vậy nếu bạn muốn sắp xếp theo độ lớn eigenvalue (loại tiêu chuẩn cho mảng NumPy có vẻ là nhỏ nhất đến lớn), bạn có thể làm:

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

Trong ví dụ thứ hai của bạn, không cần phải gọi sắp xếp() trên eig_vals một lần nữa, bạn đã có sort_perm. tức là eig_vals = eig_vals [sort_perm] – user545424

+0

Điểm tốt! Tôi không chắc liệu có sử dụng ký hiệu slice hay không '[]' đã tạo thêm một bản sao của danh sách. Suy nghĩ của tôi là ít nhất một trong số chúng có thể được thực hiện tại chỗ, và tôi không biết liệu 'a = a [sort_perm]' có hiệu quả như 'a.sort()' hay không. – ely

+0

vâng, tôi có thể làm một ít điểm chuẩn và đăng kết quả – user545424

-2

np.linalg.eig thường sẽ trả về các giá trị phức tạp. Bạn có thể cân nhắc sử dụng np.sort_complex(eig_vals).