В основном, будут задействованы два шага:
Сместите все числа на минимум по действительной и мнимой осям.
Разделите каждое значение на максимальное. величина. Чтобы получить величину комплексного числа, просто используйте np.abs()
.
Таким образом, реализация будет -
def normalize_complex_arr(a):
a_oo = a - a.real.min() - 1j*a.imag.min() # origin offsetted
return a_oo/np.abs(a_oo).max()
Примеры выполнения для проверки
Начнем с массива, в котором минимум один из [0+0j]
и еще два элемента — [x1+y1*J]
и [y1+x1*J]
. Таким образом, их величины после нормализации должны быть 1
каждая.
In [358]: a = np.array([0+0j, 1+17j, 17+1j])
In [359]: normalize_complex_arr(a)
Out[359]:
array([ 0.00000000+0.j , 0.05872202+0.99827437j,
0.99827437+0.05872202j])
In [360]: np.abs(normalize_complex_arr(a))
Out[360]: array([ 0., 1., 1.])
Далее давайте добавим смещение к минимальному элементу. Это не должно изменять их величины после нормализации -
In [361]: a = np.array([0+0j, 1+17j, 17+1j]) + np.array([2+3j])
In [362]: a
Out[362]: array([ 2. +3.j, 3.+20.j, 19. +4.j])
In [363]: normalize_complex_arr(a)
Out[363]:
array([ 0.00000000+0.j , 0.05872202+0.99827437j,
0.99827437+0.05872202j])
In [364]: np.abs(normalize_complex_arr(a))
Out[364]: array([ 0., 1., 1.])
Наконец, давайте добавим еще один элемент, который находится в два раза дальше от смещенного источника, чтобы убедиться, что этот новый элемент имеет величину 1
, а другие уменьшаются до 0.5
-
In [365]: a = np.array([0+0j, 1+17j, 17+1j, 34+2j]) + np.array([2+3j])
In [366]: a
Out[366]: array([ 2. +3.j, 3.+20.j, 19. +4.j, 36. +5.j])
In [367]: normalize_complex_arr(a)
Out[367]:
array([ 0.00000000+0.j , 0.02936101+0.49913719j,
0.49913719+0.02936101j, 0.99827437+0.05872202j])
In [368]: np.abs(normalize_complex_arr(a))
Out[368]: array([ 0. , 0.5, 0.5, 1. ])
person
Divakar
schedule
10.01.2017
1j
):np.allclose(x.real + 1j*x.imag, x)
. Или вы можете выразить это как скалярный продуктnp.dot([1,1j],[x.real,x.imag])
. - person hpaulj   schedule 11.01.2017