Python NumPy排序特征值

5
我正在使用linalg.eig(A)获取矩阵的特征值和特征向量。是否有一种简单的方法来按顺序排序这些特征值(和相关向量)?

可能是重复问题:https://dev59.com/uGsz5IYBdhLWcg3wJUYo - amcnabb
如果矩阵是实数和对称的(或者复数和共轭转置),linalg.eigh() 将按升序返回实数特征值。https://numpy.org/doc/stable/reference/generated/numpy.linalg.eigh.html - Jack Valmadre
2个回答

7
你想使用NumPy的sort()argsort()函数。argsort()返回排序数组所需的索引置换,因此如果你想按特征值大小排序(NumPy数组的标准排序似乎是从最小到最大),可以这样做:
import numpy as np

A = np.asarray([[1,2,3],[4,5,6],[7,8,9]])
eig_vals, eig_vecs = np.linalg.eig(A)

eig_vals_sorted = np.sort(eig_vals)
eig_vecs_sorted = eig_vecs[:, eig_vals.argsort()]


# Alternatively, to avoid making new arrays
# do this:

sort_perm = eig_vals.argsort()

eig_vals.sort()     # <-- This sorts the list in place.
eig_vecs = eig_vecs[:, sort_perm]

7
在您的第二个示例中,不需要再次调用sort()函数对eig_vals进行排序,因为您已经有了sort_perm。即eig_vals = eig_vals[sort_perm]。 - user545424
好观点!我不确定使用切片符号“[]”是否会使列表多出一份副本。我的想法是至少其中一个可以原地完成,而我不知道“a = a[sort_perm]”是否像“a.sort()”一样高效。 - ely
2
eig_vecs是列向量,所以应该是eig_vecs[:, eig_vals.argsort()],对吗? - amcnabb
1
@denvar 谢谢——我已经修正了拼写错误。 - ely

-3

np.linalg.eig 通常会返回复数值。您可能需要考虑使用 np.sort_complex(eig_vals)


最好确保矩阵对称并使用 linalg.eigh - Jack Valmadre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接