#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:
Вы можете сделать это с помощью полностью векторизованного метода без каких-либо итераций (кроме последнего шага).
Следующие шаги —
- Сложите действительную и мнимую части, чтобы получить
(6,2)
массив - Создайте логический массив для знаков для каждого квадранта
- Возьмите
np.where
, чтобы получить логическое значение для(6,2)
массива, положительное и отрицательное. - Возьмите XNOR
~(a^b)
между знаками и (6,2) логическим значением с широковещательной(4,1,2)^(1,6,2)->(4,6,2)
передачей, а затемnp.all
возьмитеaxis=-1
, чтобы получить(4,6)
матрицу, которая сообщает вам, какое из 6 комплексных чисел находится в одном из 4 квадрантов. - Наконец, мы должны выполнить итерацию по логическому значению и проиндексировать исходный массив 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)