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

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)

如果特征值是复杂的,则排序顺序是词典的(即,复数首先根据它们的实部进行排序,其中的关系由它们的虚部破坏).

  • 顺便提一下,从最大特征值到最小特征值进行排序更为常见.只需使用:`idx = eigenValues.argsort()[:: - 1]`. (24认同)
  • 得到k个最大特征值k = 2 idx = eigenValues.argsort()[ - k:] [:: - 1] (5认同)
  • 对于k = 1,可以使用`eigenVectors [:,eigenValues.argmax()]` (3认同)
  • @MaxNoe:根据[文档](https://docs.scipy.org/doc/numpy/reference/ generated/numpy.linalg.eig.html),“特征值不一定是有序的。” (2认同)
  • 啊,我使用的是 eigh:按升序排列的特征值,每个都根据其多重性重复。 (2认同)

Shi*_*Dua 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)
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)