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

2024-05-14 22:19:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我用numpy.linalg.eig得到特征值和特征向量的列表:

A = someMatrixArray
from numpy.linalg import eig as eigenValuesAndVectors

solution = eigenValuesAndVectors(A)

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

我想对我的特征值进行排序(例如从最低到最高),这样我就知道排序后关联的特征向量是什么。

我不想用python函数来实现这一点。有什么简单的方法或者我必须编码我的排序版本吗?


Tags: fromimportnumpy列表排序assolution特征值
3条回答

联合国大学的上述答复非常简洁明了。但是,这里有另一种方法,我们可以做得更一般,也可以用于列表。

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表示增加顺序。

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)

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

如果特征值是复数,the sort order is lexicographic(也就是说,复数首先根据其实部进行排序,并由其虚部断开连接)。

相关问题 更多 >

    热门问题