在scipy的fft函数中似乎没有做这件事情的任何函数(请参见http://www.astro.rug.nl/efidad/scipy.fftpack.basic.html)。除非你能够找到一个固定点FFT库用于Python,否则你想要的功能可能不存在,因为本地硬件浮点格式是128位。看起来你可以使用rfft方法来获取FFT的实值组件(无相位),这将节省一半的RAM。
我在交互式Python中运行了以下内容:
>>> from numpy import *
>>> v = array(10000*random.random([512,512,512]),dtype=int16)
>>> shape(v)
(512, 512, 512)
>>> type(v[0,0,0])
<type 'numpy.int16'>
此时 Python 的 RSS(常驻集大小)为 265MB。
f = fft.fft(v)
此时 Python 的 RSS 为 2.3GB。
>>> type(f)
<type 'numpy.ndarray'>
>>> type(f[0,0,0])
<type 'numpy.complex128'>
>>> v = []
在这一点上,由于我已经释放了v,RSS降至2.0GB。
使用“fft.rfft(v)”仅计算实值会导致1.3GB的RSS。(几乎是预期的一半)
执行:
>>> f = complex64(fft.fft(v))
这是两全其美的最糟糕情况,因为它首先计算complex128版本(2.3GB),然后将其复制到complex64版本(1.3GB),这意味着我的机器上峰值RSS为3.6GB,然后又降至1.3GB。
我认为如果你有4GB RAM,这一切都应该很好地运行(就像对我一样)。问题在哪里?
scipy.fftpack.rfft
支持这种操作:scipy.fftpack.rfft(v.astype(np.float32)).dtype
返回float32
。不幸的是,即使在2015年,Numpy的支持也远远落后于Scipy:https://github.com/numpy/numpy/issues/6012 - Ahmed Fasih