就在这里。您可以跳过 python 的复杂类型的步骤,因为在内部,numpy 将n
复数数组表示为2n
浮点数组。
下面是一个来自 REPL 的简单示例,说明它是如何工作的:
>>> import numpy as np
>>> a = np.array([1.,2.,3.,4.])
>>> a
array([ 1., 2., 3., 4.])
>>> a.dtype
dtype('float64')
>>> a.dtype = complex
>>> a
array([ 1.+2.j, 3.+4.j])
>>>
请注意,如果初始数组有一个dtype
以外的float
.
>>> a = np.array([1,2,3,4])
>>> a
array([1, 2, 3, 4])
>>> a.dtype
dtype('int64')
>>> a.dtype = complex
>>> a
array([ 4.94065646e-324 +9.88131292e-324j,
1.48219694e-323 +1.97626258e-323j])
>>>
在你的情况下。您想要的 dtype 是np.dtype('complex64')
因为您的每个复数都是 64 位(2*4*8)。
for x in range(dimX):
for y in range(dimY):
#2 floats, each 4 bytes, is one complex number
trace=stream.readBytes(8*dimZ)
a = np.frombuffer(trace,dtype=np.dtype('complex64'))
data[x][y] = a
这应该会加快你的速度。numpy.frombuffer()
这是 REPL 中关于如何工作的示例
>>> binary_string = struct.pack('2f', 1,2)
>>> binary_string
'\x00\x00\x80?\x00\x00\x00@'
>>> numpy.frombuffer(binary_string, dtype=np.dtype('complex64'))
array([ 1.+2.j], dtype=complex64)
>>>
编辑:我不知道numpy.frombuffer()
. 所以我创建了一个字符数组,然后更改 dtype 以获得相同的效果。谢谢@wim
编辑2:
至于进一步的速度优化,您可能会通过使用列表理解而不是显式的 for 循环来提高性能。
for x in range(dimX):
data[x] = [np.frombuffer(stream.readBytes(8*dimZ), dtype=np.dtype('complex64')) for y in range(dimY)]
而且还升级了:
data = [[np.frombuffer(stream.readBytes(8*dimZ), dtype=np.dtype('complex64'))
for y in range(dimY)]
for x in range(dimX)]