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


94

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

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

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

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

我没有找到任何使用python函数的方法。有什么简单的方法还是我必须对我的排序版本进行编码?

Answers:


153

使用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]

如果特征值是复数,则排序顺序是按字典顺序排列(也就是说,复数首先根据其实部进行排序,而其虚部则打破了联系)。


27
顺便说一句,从最大特征值到最小特征值排序更常见。只需使用:idx = eigenValues.argsort()[::-1]
卡尔·F,

5
得到k个最大特征值k = 2 idx = eigenValues.argsort()[-k:] [::-1]
mrgloom

3
对于k = 1,可以使用eigenVectors[:, eigenValues.argmax()]
utapyngo 2014年

1
@MaxNoe:根据文档,“特征值不一定是有序的。”
unutbu

2
啊,我在用eigh:特征值按升序排列,每个特征值根据其多重性重复。
MaxNoe

6

以上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用于递增顺序。


1

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.