我正在使用numpy.linalg.eig来获取特征值和特征向量的列表:
A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors
solution = eigenValuesAndVectors(A)
eigenValues = solution[0]
eigenVectors = solution[1]
我想对我的特征值进行排序(例如从最低到最高),我知道排序后关联的特征向量是什么。
我没有找到任何使用python函数的方法。有没有简单的方法,还是我必须编写我的排序版本?
答案 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