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