#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.html5. Другой трюк заключается
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.