ярлык для разделения «сложного массива» на «реальные» и «воображаемые» массивы

#python #numpy

#python #numpy

Вопрос:

допустим, у меня есть массив numpy:

 import numpy as np

x = np.array((1   2j, 2   4j, 5   10j))
 

и я хочу создать два отдельных массива, один из реального компонента, а другой с компонентом комплексного числа без j. Есть ли ярлык для выполнения этой операции в python? единственный способ, которым я могу думать об этом, — это явно:

 xr = np.zero(len(x))
xi = np.zero(len(x))
for n in range(0, len(x)):
    xr[m] = x[n].real
    xi[m] = x[n].imag
 

не знаю, просто кажется, что должен быть более быстрый способ ввести это…

Нравится

 xr = x.real?
xi = x.imag?
 

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

1. Вы действительно пробовали то, что предлагаете? Векторизация этого так же проста, как reals = x.real и x.imag

2. ошибка …. не совсем… это просто выглядело как недопустимый синтаксис… Я попробую.

3. что вы знаете … это действительно работает … python просто иногда поражает вас..

4. real и imag перечислены атрибуты np.ndarray типа данных: docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html

5. Другой трюк заключается xr, xi = x.view('(2,)float').T в том, как numpy хранятся данные

Ответ №1:

 In [145]: x = np.array((1   2j, 2   4j, 5   10j))                                    
In [146]: x                                                                          
Out[146]: array([1.  2.j, 2.  4.j, 5. 10.j])
 

Атрибуты real and imag работают для всего массива так же, как и для элементов:

 In [147]: x.real                                                                     
Out[147]: array([1., 2., 5.])
In [148]: x.imag                                                                     
Out[148]: array([ 2.,  4., 10.])
In [149]: xr, xc = x.real, x.imag                                                    
In [150]: xr                                                                         
Out[150]: array([1., 2., 5.])
In [151]: xc                                                                         
Out[151]: array([ 2.,  4., 10.])
 

view Подход, который предлагает @user3483203, говорит ему интерпретировать один и тот же буфер данных как последовательность из двух чисел с плавающей запятой:

 In [156]: x.view('(2,)float')                                                        
Out[156]: 
array([[ 1.,  2.],
       [ 2.,  4.],
       [ 5., 10.]])
In [157]: np.dtype('(2,)float')                                                      
Out[157]: dtype(('<f8', (2,)))
 

Это обозначение может быть непонятным, если вы уже не работали со структурированными массивами и составными dtypes.