【问题标题】:python numpy sort eigenvaluespython numpy排序特征值
【发布时间】:2012-04-10 05:54:43
【问题描述】:

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

【问题讨论】:

标签: python numpy


【解决方案1】:

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

【讨论】:

  • 在您的第二个示例中,无需再次在 eig_vals 上调用 sort(),您已经有了 sort_perm。即 eig_vals = eig_vals[sort_perm]
  • 好点!我不确定是否使用切片符号[] 制作了列表的额外副本。我的想法是至少其中一个可以到位,我不知道a = a[sort_perm]是否和a.sort()一样高效。
  • eig_vecs是列向量,所以应该是eig_vecs[:, eig_vals.argsort()]吧?
  • @denvar 谢谢——我修正了错字。
【解决方案2】:

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

【讨论】:

  • 最好确保矩阵是对称的并使用linalg.eigh
猜你喜欢
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
相关资源
最近更新 更多