Разбиение массивов комплексных чисел

#python-3.x #signal-processing #numpy-ndarray

#python-3.x #обработка сигналов #numpy-ndarray

Вопрос:

У меня есть массив NumPy со следующими комплексными числами. Я хочу создать 4 разных списка / массива с этими массивами. Формат будет называться Arr1 … Arr4 с r ij, -r ij, -r-ij, r-ij соответственно.

 A = ([ 1.23853755 1.15170502j, -1.2041678  1.38375402j,
       1.28973689 1.2755069j ,  -1.29422454-1.28925842j,
       -1.33236945-1.22467046j,  1.25472049 1.27488595j])
 

У вас есть какие-либо идеи, как я мог бы это закодировать? У меня есть данные из более чем 10 тыс. комплексных чисел. По сути, это символы созвездия для QPSK. Любая идея будет оценена.

Большое спасибо

Комментарии:

1. Просто для ясности, -r ij означает, что вы хотите умножить действительную часть на -1, а мнимую часть на 1?

2. Нет, я хочу разделить каждое комплексное число и создать другой массив со всеми одинаковыми комплексными числами. Например, r ij в одном массиве со всеми положительными действительными и положительными мнимыми числами в одном массиве и так далее. с обработкой действительных и мнимых чисел из 4 квадрантов.

3. а, ладно, понял. это в основном разбивает массив на куски в зависимости от условий

4. формат будет сохранен в виде r ij, никаких изменений не предполагается, просто вынимается число и помещается в другую корзину.

Ответ №1:

Вы можете сделать это с помощью полностью векторизованного метода без каких-либо итераций (кроме последнего шага).

Следующие шаги —

  1. Сложите действительную и мнимую части, чтобы получить (6,2) массив
  2. Создайте логический массив для знаков для каждого квадранта
  3. Возьмите np.where , чтобы получить логическое значение для (6,2) массива, положительное и отрицательное.
  4. Возьмите XNOR ~(a^b) между знаками и (6,2) логическим значением с широковещательной (4,1,2)^(1,6,2)->(4,6,2) передачей, а затем np.all возьмите axis=-1 , чтобы получить (4,6) матрицу, которая сообщает вам, какое из 6 комплексных чисел находится в одном из 4 квадрантов.
  5. Наконец, мы должны выполнить итерацию по логическому значению и проиндексировать исходный массив A, потому что каждый из них будет иметь разную длину, и вы не можете сохранить его как массив numpy. Поэтому я сохранил его как dict.
 A = np.array([ 1.23853755 1.15170502j, -1.2041678  1.38375402j,
              1.28973689 1.2755069j ,  -1.29422454-1.28925842j,
              -1.33236945-1.22467046j,  1.25472049 1.27488595j])

coords = np.vstack([A.real, A.imag]).T

labels = ['r ij', '-r ij', '-r-ij', 'r-ij']
signs = np.array([[True,True], [False,True], [False,False], [True,False]]) #r ij, -r ij, -r-ij, r-ij

boolean = np.all(~(signs[:,None]^np.where(coords>0,True,False)[None,:]), axis=-1) #XNOR with broadcasting

#boolean - 
# [[ True False  True False False  True]  
#  [False  True False False False False] <- second number in '-r ij'
#  [False False False  True  True False]
#  [False False False False False False]] <- no number in 'r-ij'

output = {labels[i]:A[j] for i,j in enumerate(boolean)}
output
 
 {'r ij': array([1.23853755 1.15170502j, 1.28973689 1.2755069j ,
        1.25472049 1.27488595j]),
 '-r ij': array([-1.2041678 1.38375402j]),
 '-r-ij': array([-1.29422454-1.28925842j, -1.33236945-1.22467046j]),
 'r-ij': array([], dtype=complex128)}
 

Комментарии:

1. Чудесное использование логических символов Akshay, я сделал это довольно простым способом, используя цикл. Это каким-то образом сработало.

2. да, но было бы слишком дорого использовать цикл. но если это сработает, все хорошо!

Ответ №2:

Замечательное использование boolans Akshay, я сделал это довольно простым способом, используя цикл. Это каким-то образом сработало.

 Arr1 =[] # empty lists
Arr2 =[]
Arr3 =[]
Arr4 =[]


for u in A:
    if type(u) == complex:
        continue
    if u.real > 0 and u.imag >0: # 1st quadrant constellation points 
        Arr1.append(u)
    elif u.real <0 and u.imag >0: # 2nd quadrant cp
        Arr2.append(u)
    elif u.real <0 and u.imag <0: # 3rd quadrant cp
        Arr3.append(u)
    elif u.real>0 and u.imag<0: # 4th quadrant cp
        Arr4.append(u)
        
Arr1 = np.array(Arr1) # changing lists into array for calculation purpose
Arr2 = np.array(Arr2)
Arr3 = np.array(Arr3)
Arr4 = np.array(Arr4)