Jor*_*tao 78 python sorting numpy
我正在使用numpy.linalg.eig来获取特征值和特征向量的列表:
A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors
solution = eigenValuesAndVectors(A)
eigenValues = solution[0]
eigenVectors = solution[1]
Run Code Online (Sandbox Code Playgroud)
我想对我的特征值(例如从最低到最高)进行排序,我知道排序后关联的特征向量是什么.
我没有找到任何使用python函数的方法.有没有简单的方法或我必须编码我的排序版本?
unu*_*tbu 129
使用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]
Run Code Online (Sandbox Code Playgroud)
如果特征值是复杂的,则排序顺序是词典的(即,复数首先根据它们的实部进行排序,其中的关系由它们的虚部破坏).
以上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)
Run Code Online (Sandbox Code Playgroud)
tup [0]是特征值,排序函数将基于该特征值对列表进行排序。
reverse = False用于递增顺序。
小智 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)
Run Code Online (Sandbox Code Playgroud)