将“复杂数组”拆分为“真实”和“虚构”数组的快捷方式

时间:2019-04-19 17:18:31

标签: 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

dunno,似乎应该有一种更快的键入方式...

喜欢

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

1 个答案:

答案 0 :(得分:0)

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])

realimag属性既适用于整个数组,也适用于元素:

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.])

@ user3483203建议的view方法告诉它将相同的数据缓冲区解释为两个浮点数的序列:

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,)))

除非您已经使用结构化数组和复合dtype,否则这种表示法可能会很晦涩。