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

时间:2011-11-11 10:53:36

标签: python sorting numpy

我正在使用numpy.linalg.eig来获取特征值和特征向量的列表:

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

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

我想对我的特征值进行排序(例如从最低到最高),我知道排序后关联的特征向量是什么。

我没有找到任何使用python函数的方法。有没有简单的方法,还是我必须编写我的排序版本?

3 个答案:

答案 0 :(得分:109)

使用numpy.argsort。它返回用于对数组进行排序的索引。

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]

如果特征值很复杂,the sort order is lexicographic(也就是说,复数首先按照它们的实部进行排序,并用它们的虚部破坏关系)。

答案 1 :(得分:5)

unutbu的回答非常清晰简洁。但是,这是另一种我们可以做到的方式,它更通用,也可以用于列表。

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]是特征值,sort元素将根据该特征值对列表进行排序。

reverse = False用于增加订单。

答案 2 :(得分:1)

ubuntu的代码片段不适用于我的Python 3.6.5。它导致运行时错误。所以,我重构了他/她的代码,这个代码在我的测试用例上运行正常:

Name