2015-10-01 12 views
6

interp1d मुझे आश्चर्य है कि अगर वहाँ scipy में एक interp1d वस्तु अचार के लिए एक सरल तरीका है। बेवकूफ दृष्टिकोण काम नहीं लग रहा है।अचार बनाने scipy पट्टी

import pickle 
import numpy as np 

from scipy.interpolate import interp1d 

x = np.linspace(0,1,10) 
y = np.random.rand(10) 

sp = interp1d(x, y) 

with open("test.pickle", "wb") as handle: 
    pickle.dump(sp, handle) 

यह PicklingError निम्नलिखित को जन्म देती है:

--------------------------------------------------------------------------- 
PicklingError        Traceback (most recent call last) 
<ipython-input-1-af4e3326e7d1> in <module>() 
    10 
    11 with open("test.pickle", "wb") as handle: 
---> 12  pickle.dump(sp, handle) 

PicklingError: Can't pickle <function interp1d._call_linear at 0x1058abf28>: attribute lookup _call_linear on scipy.interpolate.interpolate failed 

उत्तर

3

शायद __getstate__ और __setstate__ तरीकों के साथ किसी अन्य वर्ग में यह लपेटकर:

from scipy.interpolate import interp1d 


class interp1d_picklable: 
    """ class wrapper for piecewise linear function 
    """ 
    def __init__(self, xi, yi, **kwargs): 
     self.xi = xi 
     self.yi = yi 
     self.args = kwargs 
     self.f = interp1d(xi, yi, **kwargs) 

    def __call__(self, xnew): 
     return self.f(xnew) 

    def __getstate__(self): 
     return self.xi, self.yi, self.args 

    def __setstate__(self, state): 
     self.f = interp1d(state[0], state[1], **state[2]) 
+0

हाँ, यह काम करेंगे। असल में मैंने इसे इस तरह कार्यान्वित किया। – cel

+0

यह मूल रूप से 'xi' और' yi' arrays और keyargs को किसी भी रूप में अचार करता है। जब आप अनपिक्लिंग करते हैं तो आप फिर से 'interp1d'' कॉल करेंगे ... यदि आपका लक्ष्य सीपीयू पावर को सहेजना है, तो यह समाधान नहीं है। – fheshwfq