有没有办法降低scipy/numpy精度以减少内存消耗?

有没有办法降低scipy/numpy精度以减少内存消耗?,numpy,scipy,numerical,matplotlib,fft,Numpy,Scipy,Numerical,Matplotlib,Fft,在我的64位Debian/Lenny系统(4GByte RAM+4GByte交换分区)上,我可以成功地执行以下操作: v=array(10000*random([512,512,512]),dtype=np.int16) f=fftn(v) 但是,如果f是一个np.complex128的话,内存消耗是惊人的,如果没有MemoryError回溯,我无法对结果做更多的处理(例如调整系数,然后f=ifftn(f)) 有没有办法控制scipy/numpy的“默认精度”,让它计算一个complex64数

在我的64位Debian/Lenny系统(4GByte RAM+4GByte交换分区)上,我可以成功地执行以下操作:

v=array(10000*random([512,512,512]),dtype=np.int16)
f=fftn(v)
但是,如果f是一个
np.complex128
的话,内存消耗是惊人的,如果没有
MemoryError
回溯,我无法对结果做更多的处理(例如调整系数,然后
f=ifftn(f)

有没有办法控制scipy/numpy的“默认精度”,让它计算一个complex64数组,而不是安装更多的RAM和/或扩展我的交换分区


我知道我可以用
f=array(f,dtype=np.complex64)
来减少它;我希望它能以32位精度和一半内存完成FFT工作。

在scipy的FFT函数中似乎没有任何函数可以完成这项工作(请参阅)

除非您能够找到python的定点FFT库,否则您想要的函数不太可能存在,因为您的本机硬件浮点格式是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'>
在这一点上,Python2.3GB的RSS

>>> type(f)
<type 'numpy.ndarray'>
>>> type(f[0,0,0]) 
<type 'numpy.complex128'>
>>> v = []
是两个世界中最糟糕的,因为它首先计算complex128版本(2.3GB),然后将其复制到complex64版本(1.3GB),这意味着我机器上的RSS峰值为3.6GB,然后又稳定到1.3GB


我认为,如果你有4GB内存,这一切都应该工作得很好(就像它为我所做的那样)。有什么问题吗

Scipy 0.8将对几乎所有fft代码提供单精度支持(代码已经在主干中,因此如果现在需要该功能,您可以从svn安装Scipy)。

感谢指向rfftn函数的指针;是的,这些做得很好。f=rfftn(v)、f=array(f,dtype=np.complex64)、f=irfftn(f)的峰值使用量反过来是6224MByte。(如果没有中间转换来complex64,它将使用7754MByte…有点紧)。您的生产阵列大小实际上是否大于512^3?我不知道为什么您会看到我在上面的示例代码中看到的RAM使用率是原来的4倍……请修改您所说的“单精度不存在,因为您的本机硬件是128位的”——本机硬件的128位不超过64位,FFTW在支持这两个方面非常灵活。正如David的回答所指出的,
scipy.fftpack.rfft
支持这一点:
scipy.fftpack.rfft(v.astype(np.float32)).dtype
返回
float32
。不幸的是,即使在2015年,Numpy的支持也落后于Scipy:
>>> type(f)
<type 'numpy.ndarray'>
>>> type(f[0,0,0]) 
<type 'numpy.complex128'>
>>> v = []
>>> f = complex64(fft.fft(v))