在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]
我想把我的特征值排序(比如从小到大),这样我就能知道排序后对应的特征向量是什么。
我找不到用Python函数做到这一点的方法。有没有简单的方法,还是说我得自己写个排序的代码?
3 个回答
6
这个人在使用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)
7
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] 是用来作为排序的依据,也就是特征值,排序函数会根据它来对列表进行排序。
reverse = False 表示按升序排列。
207
使用 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]
如果特征值是复杂的数字,排序的规则是字典序(也就是说,复杂数字会先根据它们的实部进行排序,如果实部相同,就再根据它们的虚部来决定顺序)。