三次样条内存错误

12

在一台只有4GB内存的计算机上,这种简单的插值会导致内存错误:

(参考来源:http://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html

import numpy as np
from scipy.interpolate import interp1d

x = np.linspace(0, 10, 80000)
y = np.cos(-x**2/8.0)
f2 = interp1d(x, y, kind='cubic')

我考虑将数据分成块,但有没有一种方法可以在不需要太多内存的情况下执行这个三次样条插值呢?它为什么会出现问题?


1
我在一台有16GB内存的电脑上遇到了内存错误,所以不要急着购买更多内存来解决这个问题。 :) - Warren Weckesser
这只是一个测试用例,用于解决实际函数行为不佳的问题吗?否则,您可能不需要80000个数据点!即使只有800个数据点,插值函数和区间[0,10]上的 np.cos(-x**2/8.0) 之间的最坏情况误差也小于2e-8。 - Warren Weckesser
是的,这只是一个工作示例。 - HyperCube
1
即使有32GB的内存,我仍然会收到错误信息。 - dashesy
1个回答

12

如果在错误发生时查看回溯,你会看到类似于:

---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
<ipython-input-4-1e538e8d766e> in <module>()
----> 1 f2 = interp1d(x, y, kind='cubic')

/home/warren/local_scipy/lib/python2.7/site-packages/scipy/interpolate/interpolate.py in __init__(self, x, y, kind, axis, copy, bounds_error, fill_value)
    390         else:
    391             minval = order + 1
--> 392             self._spline = splmake(x, y, order=order)
    393             self._call = self.__class__._call_spline
    394 

/home/warren/local_scipy/lib/python2.7/site-packages/scipy/interpolate/interpolate.py in splmake(xk, yk, order, kind, conds)
   1754 
   1755     # the constraint matrix
-> 1756     B = _fitpack._bsplmat(order, xk)
   1757     coefs = func(xk, yk, order, conds, B)
   1758     return xk, coefs, order

MemoryError: 

出现问题的函数是 scipy.interpolate._fitpack._bsplmat(order, xk)。该函数创建一个形状为 (len(xk), len(xk) + order - 1) 的64位浮点数2D数组,在您的情况下,大小为51GB。

不要使用interp1d,尝试看看InterpolatedUnivariateSpline是否适合您的需要。例如:

import numpy as np
from scipy.interpolate import InterpolatedUnivariateSpline

x = np.linspace(0, 10, 80000)
y = np.cos(-x**2/8.0)
f2 = InterpolatedUnivariateSpline(x, y, k=3)
我不会遇到内存错误。

感谢您提供这个合适的解决方案! - HyperCube
谢谢,我认为应该使用这个替代默认值,因为对于需要order最后几个点的东西来说,默认值消耗太多内存。 - dashesy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接