Numpy:从2个真正的数组创build一个复杂的数组?

我发誓这应该是那么容易…为什么不呢? 🙁

实际上,我想将两个相同的数组合成一个复数组:

Data[:,:,:,0] , Data[:,:,:,1] 

这些不起作用:

 x = np.complex(Data[:,:,:,0], Data[:,:,:,1]) x = complex(Data[:,:,:,0], Data[:,:,:,1]) 

我错过了什么吗? numpy不喜欢在复数上执行数组函数吗? 这是错误:

 TypeError: only length-1 arrays can be converted to Python scalars 

这似乎是做你想做的事情:

 numpy.apply_along_axis(lambda args: [complex(*args)], 3, Data) 

这是另一个解决scheme:

 # The ellipsis is equivalent here to ":,:,:"... numpy.vectorize(complex)(Data[...,0], Data[...,1]) 

而另一个更简单的解决scheme:

 Data[...,0] + 1j * Data[...,1] 

PS :如果你想节省内存(没有中间数组):

 result = 1j*Data[...,1]; result += Data[...,0] 

下面的devS解决scheme也很快。

当然,这是相当明显的:

 Data[...,0] + 1j * Data[...,1] 

如果你的实部和虚部是沿着最后一个维度的切片,并且你的arrays在最后维度上是连续的,那么你可以做

 A.view(dtype=np.complex128) 

如果你正在使用单精度浮点数,这将是

 A.view(dtype=np.complex64) 

这是一个更完整的例子

 import numpy as np from numpy.random import rand # Randomly choose real and imaginary parts. # Treat last axis as the real and imaginary parts. A = rand(100, 2) # Cast the array as a complex array # Note that this will now be a 100x1 array A_comp = A.view(dtype=np.complex128) # To get the original array A back from the complex version A = A.view(dtype=np.float64) 

如果你想摆脱铸造中留下的额外维度,你可以做类似的事情

 A_comp = A.view(dtype=np.complex128)[...,0] 

这是有效的,因为在内存中,一个复数实际上只是两个浮点数。 第一个代表实部,第二个代表虚部。 数组的视图方法更改数组的dtype,以反映您想将两个相邻的浮点值视为单个复数,并相应地更新该维度。

此方法不会复制数组中的任何值或执行任何新的计算,只是创build一个新的数组对象,以不同的方式查看同一块内存。 这使得这个操作比任何涉及复制值的操作都快得多。 这也意味着在复数值arrays中所做的任何改变都会反映在具有实部和虚部的arrays中。

如果在types转换后立即删除多余的轴,那么恢复原始数组也可能会有点麻烦。 像A_comp[...,np.newaxis].view(np.float64)目前不起作用,因为在撰写本文时,NumPy在添加新轴时未检测到数组仍然是C连续的。 看到这个问题 。 A_comp.view(np.float64).reshape(A.shape)似乎在大多数情况下工作。

这是你正在寻找的东西:

 from numpy import array a=array([1,2,3]) b=array([4,5,6]) a + 1j*b ->array([ 1.+4.j, 2.+5.j, 3.+6.j]) 

我是python新手所以这可能不是最有效的方法,但是,如果我正确理解问题的意图,下面列出的步骤为我工作。

 >>> import numpy as np >>> Data = np.random.random((100, 100, 1000, 2)) >>> result = np.empty(Data.shape[:-1], dtype=complex) >>> result.real = Data[...,0]; result.imag = Data[...,1] >>> print Data[0,0,0,0], Data[0,0,0,1], result[0,0,0] 0.0782889873474 0.156087854837 (0.0782889873474+0.156087854837j) 
 import numpy as np n = 51 #number of data points # Suppose the real and imaginary parts are created independently real_part = np.random.normal(size=n) imag_part = np.random.normal(size=n) # Create a complex array - the imaginary part will be equal to zero z = np.array(real_part, dtype=complex) # Now define the imaginary part: z.imag = imag_part print(z) 

这对我有用:

input:

 from scipy import * array([[1,2],[3,2]]).astype(complex) 

输出:

 array([[ 1.+0.j, 2.+0.j], [ 3.+0.j, 2.+0.j]])