ordina gli autovalori e gli autovettori associati dopo aver utilizzato numpy.linalg.eig in python


94

Sto usando numpy.linalg.eig per ottenere un elenco di autovalori e autovettori:

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

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

Vorrei ordinare i miei autovalori (ad esempio dal più basso al più alto), in un modo in cui so qual è l'autovettore associato dopo l'ordinamento.

Non trovo alcun modo per farlo con le funzioni Python. C'è un modo semplice o devo codificare la mia versione di ordinamento?

Risposte:


153

Usa numpy.argsort . Restituisce gli indici che si utilizzerebbero per ordinare l'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]

Se gli autovalori sono complessi, l'ordinamento è lessicografico (ovvero, i numeri complessi vengono ordinati in base alla loro parte reale prima, con i legami interrotti dalla loro parte immaginaria).


27
Per inciso, è più comune ordinare dal più grande al più piccolo autovalore. solo uso: idx = eigenValues.argsort()[::-1].
Carl F.

5
per ottenere k autovalori più grandi k = 2 idx = eigenValues.argsort () [- k:] [:: - 1]
mrgloom

3
Per k = 1 si può usareeigenVectors[:, eigenValues.argmax()]
utapyngo

1
@MaxNoe: Secondo la documentazione , "Gli autovalori non sono necessariamente ordinati."
unutbu

2
Ah, stavo usando eigh: gli autovalori in ordine crescente, ciascuno ripetuto secondo la sua molteplicità.
MaxNoe

6

La risposta sopra di unutbu è molto chiara e concisa. Ma ecco un altro modo in cui possiamo farlo più generale e può essere utilizzato anche per gli elenchi.

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)

Questo tup [0] è l'autovalore in base al quale la funzione di ordinamento ordinerà l'elenco.

reverse = False è per ordine crescente.


1

Il pezzo di codice di Ubuntu non funziona sul mio Python 3.6.5. Conduce errori in fase di esecuzione. Quindi, ho refactoring il suo codice su questo che funziona bene sui miei casi di test:

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.