urutkan nilai eigen dan vektor eigen terkait setelah menggunakan numpy.linalg.eig dengan python

95

Saya menggunakan numpy.linalg.eig untuk mendapatkan daftar eigenvalues ​​dan eigenvectors:

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

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

Saya ingin mengurutkan eigenvalues ​​saya (misalnya dari yang terendah ke tertinggi), dengan cara yang saya tahu apa vektor eigen terkait setelah penyortiran.

Saya tidak menemukan cara untuk melakukan itu dengan fungsi python. Apakah ada cara sederhana atau saya harus mengkodekan versi sortir saya?

Jorge Leitao
sumber

Jawaban:

155

Gunakan numpy.argsort . Ini mengembalikan indeks yang akan digunakan untuk mengurutkan array.

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]

Jika nilai eigen kompleks, urutan pengurutannya adalah leksikografik (yaitu, bilangan kompleks diurutkan berdasarkan bagian aslinya terlebih dahulu, dengan ikatan yang diputus oleh bagian imajinernya).

unutbu
sumber
27
Secara kebetulan, lebih umum untuk mengurutkan dari nilai eigen terbesar ke terkecil. hanya digunakan: idx = eigenValues.argsort()[::-1].
Carl F.
5
untuk mendapatkan k nilai eigen terbesar k = 2 idx = eigenValues.argsort () [- k:] [:: - 1]
mrgloom
3
Untuk k = 1 seseorang dapat menggunakaneigenVectors[:, eigenValues.argmax()]
utapyngo
1
@MaxNoe: Sesuai dokumen , "Nilai eigen belum tentu diurutkan."
unutbu
2
Ah, saya menggunakan delapan: Nilai eigen dalam urutan menaik, masing-masing diulang sesuai dengan multiplisitasnya.
MaxNoe
6

Jawaban di atas oleh unutbu sangat tajam dan ringkas. Tapi, berikut adalah cara lain yang bisa kita lakukan yang lebih umum dan juga bisa digunakan untuk daftar.

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] ini adalah nilai eigen berdasarkan fungsi sortir yang akan mengurutkan daftar.

reverse = False untuk meningkatkan order.

ShikharDua
sumber
1

Potongan kode ubuntu tidak berfungsi pada Python 3.6.5 saya. Ini menyebabkan kesalahan run-time. Jadi, saya memperbarui kodenya menjadi yang ini yang berfungsi dengan baik pada kasus pengujian saya:

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)
std.approach
sumber