2014-01-29 11 views
11

Auf einem Computer mit 4 GB Speicher dieses einfache Interpolation führt zu einem Speicherfehler:Cubic Spline-Speicherfehler

(basierend auf: 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') 

dachte ich über die Daten in Stücke schneiden, aber Gibt es eine Möglichkeit, diese kubische Spline-Interpolation durchzuführen, ohne so viel Speicher zu benötigen? Warum kommt es überhaupt in Schwierigkeiten?

+1

Ich bekomme einen Speicherfehler auf einem Computer mit 16 GB, also nicht überstürzen und mehr Speicher kaufen, um dies zu beheben. :) –

+0

Ist das nur ein Testfall für ein Problem, bei dem die eigentliche Funktion weniger gut funktioniert? Sonst brauchen Sie wahrscheinlich nicht 80000 Punkte! Selbst bei 800 Punkten ist der Worst-Case-Fehler zwischen dem Interpolanten und 'np.cos (-x ** 2/8.0)' auf dem Intervall [0, 10] kleiner als 2e-8. –

+0

Ja, das war nur ein funktionierendes Beispiel. – HyperCube

Antwort

12

Wenn man sich die Zurückverfolgungs aussehen, wenn der Fehler auftritt, werden Sie so etwas wie sehen:

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

Die Funktion, die fehlschlägt ist scipy.interpolate._fitpack._bsplmat(order, xk). Diese Funktion erstellt ein 2-d Array von 64-Bit-Floats mit der Form (len(xk), len(xk) + order - 1). In Ihrem Fall ist dies über 51 GB.

Statt interp1d, sehen Sie, ob InterpolatedUnivariateSpline für Sie arbeitet. Zum Beispiel

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) 

Ich bekomme damit keinen Speicherfehler.

+0

Vielen Dank für diese geeignete Lösung! – HyperCube

+0

danke, ich denke, das sollte anstelle der Standard verwendet werden, die zu viel memroy für etwas verbraucht, das Speicher für letzte Punkte 'Ordnung' benötigt – dashesy

Verwandte Themen