Estou usando numpy.linalg.eig para obter uma lista de valores e vetores próprios:
A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors
solution = eigenValuesAndVectors(A)
eigenValues = solution[0]
eigenVectors = solution[1]
Gostaria de classificar meus autovalores (por exemplo, do mais baixo para o mais alto), de uma forma que sei qual é o autovetor associado após a classificação.
Não estou encontrando nenhuma maneira de fazer isso com funções Python. Existe alguma maneira simples ou tenho de codificar minha versão de classificação?
idx = eigenValues.argsort()[::-1]
.eigenVectors[:, eigenValues.argmax()]
A resposta acima por unutbu é muito nítida e concisa. Mas, aqui está uma outra maneira de fazer isso mais geral e pode ser usada para listas também.
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)
Este tup [0] é o valor próprio com base no qual a função de classificação classificará a lista.
reverse = False é para ordem crescente.
fonte
O pedaço de código do ubuntu não funciona no meu Python 3.6.5. Isso leva a erros em tempo de execução. Então, eu refatorei seu código para este que funciona bem em meus casos de teste:
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)
fonte