我正在尝试在一些用户定义的连续2D x,y位置进行插值,这是在常规笛卡尔网格(i,j)上定义的2D函数的值。
我尝试过,使用scipy.interpolate中的interp2d函数来获取一个函数,通过使用适当的模型进行插值,可以在(x,y)处返回f值。
参见文档:
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 :(得分:3)
问题在于样条拟合程序对结选择中需要多少空间做出了非常悲观的估计(此算法:http://netlib.org/dierckx/surfit.f,请参阅lwrk2的描述并以悲观的方式进行数学运算 - - 它提供~200 GB)。
请注意,这是非结构化数据插值例程--- interp2d也可以传递不在常规网格上的输入数据。 4098 * 1602 = 6564996是用于分散数据插值的相当多的数据点,即使数据在网格上有规律地排列也很容易管理,就像在这种情况下一样。
在Scipy 0.12.0中如何工作was changed,其中interp2d在这种情况下推断数据在矩形网格上,并且在这种特殊情况下使用更有效的算法。
答案 1 :(得分:0)
你真的需要这么精细的网格吗?您可以通过减少网格的粒度来节省内存。
这使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()