Как отсортировать собственные значения в python / numpy сначала по вещественной части, а затем по мнимой - PullRequest
0 голосов
/ 31 марта 2020

Я вычислил собственные значения якобианской матрицы 5x5 во время цикла по параметру R.

Я получаю как действительные, так и комплексные собственные значения, как и ожидалось, но все они приведены в сложной форме. Проблема, с которой я сталкиваюсь, заключается в том, что numpy.sort сортирует эти значения по действительной части каждого собственного значения, которое полезно для точки, но действительная часть каждого собственного значения либо увеличивается / уменьшается, так как я меняюсь R.

Таким образом, возникает точка, в которой мне нужно сортировать по мнимой части, чтобы сохранить каждое собственное значение в той же записи в выходном массиве. Картинка ниже показывает, что я имею в виду. Я получаю 3 реальных собственных значения, отображаемых в позициях 2, 3 и 4 в массиве, переходя в позиции 0,1 и 4. Как я могу отсортировать по мнимой части? Я добавил свой код ниже. Колонка переключения собственных значений

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))

РЕДАКТИРОВАТЬ: Подумав об этом, я не думаю, что сортировка поможет мне здесь. Спасибо тем, кто ответил.

I w * sh для сохранения чисто реального собственного значения в одной и той же позиции в массиве для каждой итерации. Сортировка - это именно то, что заставляет ее менять положение.

  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 действительное root находится в положении 2, но для i = 4.3 действительная часть уменьшается, поэтому np.sort перемещает ее в позицию 0.

Я не уверен, что есть простой способ обойти это, но любые предложения будут хороши.

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Ваш вопрос не очень понятен, но я постараюсь ответить хотя бы на этот ключевой элемент:

Как мне отсортировать по мнимой части?

Вы можете просто временно поменяйте действительную и воображаемую части:

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]

Если вам нужен более точный ответ по вашему делу, отредактируйте ваш вопрос с воспроизводимым примером, который будет помочь сообществу попытаться помочь вам.

0 голосов
/ 31 марта 2020

Я предполагаю, что вы хотите отсортировать np.array() комплексных чисел сначала по real части, а затем imaginary части. По крайней мере, я думаю, что это главное в вашем вопросе.

Скажем, у вас есть:

import numpy as np

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

Numpy документация на numpy.sort() состояния:

Порядок сортировки комплексных чисел лексикографический c. Если как действительная, так и мнимая части не являются нан, то порядок определяется действительными частями, за исключением случаев, когда они равны, и в этом случае порядок определяется мнимыми частями .

Итак, вот вам go, 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) и порядок их сортировки в порядке возрастания.

...