Ошибка кубической сплайновой памяти

На компьютере с 4 ГБ памяти эта простая интерполяция приводит к ошибке памяти:

(на основе: 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

Если вы посмотрите на трассировку при возникновении ошибки, вы увидите что-то вроде:

---------------------------------------------------------------------------
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). Эта функция создает 2-мерный массив из 64-битных поплавков с формой (len(xk), len(xk) + order - 1). В вашем случае это более 51 ГБ.

Вместо 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)

Я не получаю с этим ошибку памяти.