在Python中使用numpy.linalg.eig后排序特征值和特征向量

128 投票
3 回答
116479 浏览
提问于 2025-04-17 06:07

我正在使用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]

如果特征值是复杂的数字,排序的规则是字典序(也就是说,复杂数字会先根据它们的实部进行排序,如果实部相同,就再根据它们的虚部来决定顺序)。

撰写回答