在 python 中使用 numpy.linalg.eig 对特征值和相关特征向量进行排序

我正在使用 numpy.linalg.eig 获取一个特征矢量列表:

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors


solution = eigenValuesAndVectors(A)


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

我想排序我的特征值(例如从最低到最高) ,在某种程度上,我知道什么是相关的特征向量排序后。

I'm not finding any way of doing that with python functions. Is there any simple way or do I have to code my sort version?

98076 次浏览

Use Numpy Argsort. It returns the indices one would use to sort the 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]

如果特征值是复数,排序顺序是字典式的(也就是说,复数首先根据它们的实数部分进行排序,并用它们的虚数部分打破关系)。

Above answer by unutbu is very crisp and concise. But, here is another way we can do it which more general and can be used for lists as well.

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]是特征值,排序函数将根据这个特征值对列表进行排序。

是用来增加顺序的。

Ubuntu 的一段代码在我的 Python 3.6.5上无法工作。它导致运行时错误。因此,我重构了他/她的代码,使之适用于我的测试用例:

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)