sắp xếp eigenvalues ​​và eigenvectors liên quan sau khi sử dụng numpy.linalg.eig trong python


94

Tôi đang sử dụng numpy.linalg.eig để lấy danh sách các giá trị riêng và các giá trị riêng:

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

eigenValues = solution[0]
eigenVectors = solution[1]

Tôi muốn sắp xếp các giá trị riêng của mình (ví dụ: từ thấp nhất đến cao nhất), theo cách tôi biết đâu là giá trị riêng được liên kết sau khi sắp xếp.

Tôi không tìm thấy bất kỳ cách nào để làm điều đó với các hàm python. Có cách nào đơn giản không hay tôi phải viết mã phiên bản sắp xếp của mình?

Câu trả lời:


153

Sử dụng numpy.argsort . Nó trả về các chỉ số mà người ta sẽ sử dụng để sắp xếp mảng.

import numpy as np
import numpy.linalg as linalg

A = np.random.random((3,3))
eigenValues, eigenVectors = linalg.eig(A)

idx = eigenValues.argsort()[::-1]   
eigenValues = eigenValues[idx]
eigenVectors = eigenVectors[:,idx]

Nếu các giá trị riêng phức tạp, thứ tự sắp xếp là từ vựng (nghĩa là, các số phức được sắp xếp theo phần thực của chúng trước, với các mối quan hệ bị phá vỡ bởi phần ảo của chúng).


27
Ngẫu nhiên, nó phổ biến hơn để sắp xếp từ giá trị riêng lớn nhất đến nhỏ nhất. chỉ sử dụng: idx = eigenValues.argsort()[::-1].
Carl F.

5
để nhận k giá trị eigen lớn nhất k = 2 idx = eigenValues.argsort () [- k:] [:: - 1]
mrgloom

3
Đối với k = 1 ta có thể sử dụngeigenVectors[:, eigenValues.argmax()]
utapyngo

1
@MaxNoe: Theo tài liệu , "Các giá trị riêng không nhất thiết phải được sắp xếp theo thứ tự."
unutbu

2
À, tôi đang sử dụng thứ tám: Các giá trị riêng theo thứ tự tăng dần, mỗi giá trị lặp lại theo tính đa dạng của nó.
MaxNoe

6

Câu trả lời trên của unutbu rất rõ ràng và ngắn gọn. Tuy nhiên, đây là một cách khác mà chúng ta có thể làm, cách này tổng quát hơn và cũng có thể được sử dụng cho danh sách.

eval, evec =  sp.eig(A)
ev_list = zip( eval, evec )
ev_list.sort(key=lambda tup:tup[0], reverse=False)
eval, evec = zip(*ev_list)

Tup [0] này là giá trị riêng dựa trên đó hàm sắp xếp sẽ sắp xếp danh sách.

ngược lại = Sai là cho thứ tự tăng dần.


1

Đoạn mã của ubuntu không hoạt động trên Python 3.6.5 của tôi. Nó dẫn đến lỗi thời gian chạy. Vì vậy, tôi đã cấu trúc lại mã của anh ấy / cô ấy thành mã này hoạt động tốt trên các trường hợp thử nghiệm của tôi:

import numpy as np
from numpy import linalg as npla
#
def eigen(A):
    eigenValues, eigenVectors = npla.eig(A)
    idx = np.argsort(eigenValues)
    eigenValues = eigenValues[idx]
    eigenVectors = eigenVectors[:,idx]
    return (eigenValues, eigenVectors)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.