0

我试图在某个用户定义的、连续的 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()
4

2 回答 2

3

问题是样条拟合例程对节点选择中需要多少空间进行了极其悲观的估计(此算法:http : //netlib.org/dierckx/surfit.f,请参阅 lwrk2 的描述并在悲观的方式 --- 它提供约 200 GB)。

请注意,这是一个非结构化数据插值例程 --- interp2d 也可以传递不在常规网格上的输入数据。4098*1602=6564996 是相当多的数据点,用于分散数据插值,即使数据按规则排列在网格上也很容易管理,如本例。

它的工作方式在 Scipy 0.12.0中发生了变化,其中 interp2d 在这种情况下推断数据位于矩形网格上,并在这种特殊情况下使用更有效的算法。

于 2013-04-10T22:27:56.330 回答
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()
于 2013-04-09T21:23:53.980 回答