2013-04-09 92 views
0

我试图在一些用户定义的,连续的2D x,y位置插值一个2D函数的值,它定义在一个普通的笛卡尔网格(i,j)上。scipy interp2d崩溃无法分配内存,任何替代?

我试过的是使用scipy.interpolate函数interp2d来获得一个函数,通过插入一个适当的模型,返回f(x,y)的值。

看到该文档:

http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp2d.html

下面的代码重新,我有一个错误。似乎interp2d崩溃,因为它不能分配那么多的内存。

任何想法如何做到这一点,否则呢?

import scipy.interpolate as interp 
    import numpy as np 


    def main(): 
     x = np.arange(4098)/4097. 
     z = np.arange(1602)/1601. 

     xx,zz = np.meshgrid(x,z) 
     f = np.sin(xx**2 + zz**2) 

     ff = interp.interp2d(x,z,f, kind='linear') 


    if __name__ == '__main__': 
     main() 
+0

您是否正在使用上面显示的代码来获取错误,以及这些尺寸数组?你有多少内存? 'f','xx'和'zz'每个都小于54兆字节。 “interp2d”应该没有问题。 – 2013-04-10 15:00:11

+0

我在上面贴出的代码有错误,这些尺寸是。我得到这个错误: 1.0 1.0 (1602,4098)(1602,4098) (1602,4098) 的Python(25673)的malloc:*** MMAP(大小= 18446744062377512960)失败(错误代码= 12) ***错误:不能分配区域 – MCF 2013-04-10 16:17:04

+0

那里有什么严重错误,我不认为它是interp2d。你在使用什么操作系统? 32或64位?你是如何安装numpy和scipy的? – 2013-04-10 16:43:37

回答

0

你真的需要这么好的meshgrid吗?您可以通过减少网格的粒度来节省内存。

这使得x范围从0到1蒙山100等距点:

x = np.linspace(0, 1, 100) 

import scipy.interpolate as interp 
import numpy as np 


def main(): 
    x = np.linspace(0, 1, 100) 
    z = np.linspace(0, 1, 100) 

    xx,zz = np.meshgrid(x,z) 
    f = np.sin(xx**2 + zz**2) 

    ff = interp.interp2d(x,z,f, kind='linear') 


if __name__ == '__main__': 
    main() 
+0

是的,我从模拟中获取网格,并且需要使用此分辨率。 – MCF 2013-04-10 02:09:28

3

的问题是,花键嵌合例程使得多少空间需要极其悲观估计在结选择中(该算法:http://netlib.org/dierckx/surfit.f,参见lwrk2的描述并以悲观的方式进行数学运算 - 它给出了〜200GB)。

请注意,这是一个非结构化数据插值程序--- interp2d也可以传递不是在常规网格上的输入数据。 4098 * 1602 = 6564996是用于分散数据插值的相当大数量的数据点,即使数据在网格上有规律地排列也很容易管理,就像这种情况一样。

这是如何工作was changed在Scipy 0.12.0中,其中interp2d在这种情况下推导数据是在矩形网格上,并在这种特殊情况下使用更有效的算法。