2014-01-29 2 views
11

На компьютере с 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

Я получаю ошибку памяти на компьютере с 16 ГБ, поэтому не спешите и покупайте больше памяти, чтобы исправить это. :) –

+0

Является ли это всего лишь тестовым примером для проблемы, в которой фактическая функция менее хорошо себя ведет? В противном случае вам, вероятно, не нужно 80000 очков! Даже с 800 точками наихудшая ошибка между интерполяцией и «np.cos (-x ** 2/8.0)» на интервале [0, 10] меньше, чем 2e-8. –

+0

Да, это был просто рабочий пример. – HyperCube

ответ

12

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

--------------------------------------------------------------------------- 
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) 

У меня нет ошибки памяти.

+0

Спасибо за это подходящее решение! – HyperCube

+0

спасибо, я думаю, что это нужно использовать вместо дефолта, который потребляет слишком много memroy для чего-то, что требует памяти для 'order' последних точек – dashesy

Смежные вопросы