【问题标题】:How to sort eigenvalues in python/numpy first by real part then by imaginary part如何在python / numpy中先按实部然后按虚部对特征值进行排序
【发布时间】:2020-07-12 06:17:38
【问题描述】:

我在循环参数 R 时计算了 5x5 雅可比矩阵的特征值。

我得到了预期的实数和复数特征值,但都以复数形式给出。我遇到的问题是numpy.sort 按每个特征值的实部对这些值进行排序,这对某个点很有用,但是每个特征值的实部随着 R 的变化而增加/减少。

因此,我需要按虚部排序,以将每个特征值保留在输出数组的同一条目中。下图显示了我的意思。我得到 3 个实数特征值显示在数组中的位置 2、3 和 4,跳到位置 0,1 和 4。如何按虚部排序?我在下面添加了我的代码。 Eigenvalues switching column

import numpy.linalg as la

for a,b,c,d,e,f in zip(T_S, T_C, S_S, S_C, w, R):

    eigvals = la.eigvals(np.array([[-f, e, 0, 0, b], 
                                   [-e, -f, 0, 0, -a], 
                                   [0, 0, -f, e, d],
                                   [0, 0, -e, -d, -c], 
                                   [-1/(2*F), 0, D/(2*F), 0, -1/F]]))

    eigvals = np.sort(eigvals)
    print(np.round(eigvals, decimals = 3))

编辑:考虑到这一点,我认为排序不会对我有所帮助。感谢那些回答的人。

我希望在每次迭代时将纯实特征值保持在数组中的相同位置。排序正是使它改变位置的原因。

  for i = 4.2 eigvals = [-0.33-4.16j -0.33+4.16j -0.33+0.j    0.  -4.2j   0. +4.2j ]
  for i = 4.3 eigvals = [-0.35+0.j   -0.33-4.26j -0.33+4.26j  0.  -4.3j   0.  +4.3j ]

在 i = 4.2 的情况下,实根位于位置 2,但对于 i = 4.3,实部减小,因此 np.sort 将其移动到位置 0。

我不确定是否有简单的解决方法,但任何建议都会很棒。

【问题讨论】:

标签: python numpy sorting spyder complex-numbers


【解决方案1】:

你的问题不是很清楚,但我会尝试至少回答这个关键要素:

如何按虚部排序?

您可以简单地暂时交换真实和想象的部分:

import numpy as np
a = np.array([-1+1j, 0-1j, 1])

def xch_real_imag(arr):
    return a.imag + 1j * a.real

print(a)
imag_sorted = xch_real_imag(np.sort(xch_real_imag(a)))
print(imag_sorted)

产量

[-1.+1.j  0.-1.j  1.+0.j]
[ 1.-1.j -1.+0.j  0.+1.j]

如果您需要关于您的案例的更准确答案,请使用可重复的示例编辑您的问题,这将有助于社区尝试帮助您。

【讨论】:

    【解决方案2】:

    我假设您想先按real 部分然后imaginary 部分对复数的np.array() 进行排序。至少,我认为这是您问题的主要内容。

    假设你有:

    import numpy as np
    
    a = np.array([3+4j, 1+2j, 3+3j, 3+2j])
    

    numpy.sort() 上的 Numpy documentation 状态:

    复数的排序顺序是字典顺序的。如果两者都是真实的 和虚部是非南然后顺序由 实部,除非它们相等,在这种情况下,顺序是 由虚部决定。

    所以,你去吧,numpy 会为你处理这些,无需花哨的操作。对于上面的例子,你可以这样做:

    print(a)
    x = np.sort(a)
    print(x)
    

    输出:

    [3.+4.j 1.+2.j 3.+3.j 3.+2.j] # prior to sorting
    
    [1.+2.j 3.+2.j 3.+3.j 3.+4.j] # sorted
    

    注意最后 3 个项目如何具有相同的实部 (3) 和三个不同的虚部 (2, 3, 4),以及它们如何按升序排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-25
      • 2013-11-19
      • 2018-05-12
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      相关资源
      最近更新 更多