2013-06-04 7 views
6

मैं scipy.interpolate.UnivariateSpline का उपयोग कर बड़ी मात्रा में डेटा को आसानी से विभाजित करने के लिए उपयोग कर रहा हूं। बहुत अच्छा काम करता है। मुझे एक ऑब्जेक्ट मिलता है जो फ़ंक्शन की तरह कार्य करता है।scipy.interpolate.UnivariateSpline बाद में पाइथन या मैटलैब में मूल डेटापॉइंट्स की आवश्यकता के बिना

अब मैं बाद में स्पलीन बिंदुओं को सहेजना चाहता हूं और मूल डेटा की आवश्यकता के बिना उन्हें मैटलैब (और पायथन, लेकिन यह कम जरूरी है) में भी उपयोग करना चाहता हूं। मैं यह कैसे कर सकता हूँ?

scipy में मुझे कोई सुराग नहीं है; UnivariateSpline पहले से गणना नॉट्स और गुणांक के साथ एक कन्स्ट्रक्टर की पेशकश प्रतीत नहीं होता है।

MATLAB में, मैं Matlab कार्यों spline() और pchip(), और दोनों करीब आ जबकि की कोशिश की है, वे अंतिम बिंदुओं उस तरह की Gibbs ears की तरह लग रही के पास त्रुटियाँ हैं।

यहाँ डेटा का एक नमूना सेट मेरे पास है, मैटलैब स्वरूप में है:

splinedata = struct('coeffs',[-0.0412739180955273 -0.0236463479425733 0.42393753107602 -1.27274336116436 0.255711720888164 1.93923263846732 -2.30438927604816 1.02078680231079 0.997156858475075 -2.35321792387215 0.667027554745454 0.777918416623834],... 
'knots',[0 0.125 0.1875 0.25 0.375 0.5 0.625 0.75 0.875 0.9999],... 
'y',[-0.0412739180955273 -0.191354308450615 -0.869601364377744 -0.141538578624065 0.895258135865578 -1.04292294390242 0.462652465278345 0.442550440125204 -1.03967756446455 0.777918416623834]) 

गुणांक और समुद्री मील scipy UnivariateSpline पर get_coeffs() और get_knots() बुला के परिणाम हैं। 'Y' मूल्यों अधिक सटीक समुद्री मील पर UnivariateSpline के मूल्यों कर रहे हैं, या:

y = f(f.get_knots()) 

जहां च मेरी UnivariateSpline है।

वक्र-फिटिंग टूलबॉक्स का उपयोग किए बिना, यूनिवर्सेटस्प्लाइन के व्यवहार से मेल खाने वाली एक स्पलीन बनाने के लिए मैं इस डेटा का उपयोग कैसे कर सकता हूं? मुझे मैटलैब में कोई भी डेटा फिटिंग करने की आवश्यकता नहीं है, मुझे सिर्फ यह जानने की जरूरत है कि कैसे नॉट्स/गुणांक/स्पलीन मानों से घन स्पलीन बनाना है।

+0

मैं अगर यह मदद करता है पता नहीं है, लेकिन एक 'UnivariateSpline' वस्तु कम से कम, pickleable हो रहा है मामले में आप फिर से उपयोग करना चाहता था पायथन में आपका फिट –

+0

ओपी के प्रश्न का विस्तृत उत्तर http://stackoverflow.com/questions/22488637/getting-spline-equation-from-univariatespline-object/25330648#25330648 पर पोस्ट किया गया है। यह उत्तर स्पिनलाइन नॉट्स और गुणांक का मैन्युअल रूप से मूल्यांकन करने का माध्यम प्रदान करता है, ताकि ओपी अन्य कार्यक्रमों द्वारा उपयोग किए गए इनपुट तक मिलान करने का प्रयास कर सके। – nzh

उत्तर

1

scipy में, scipy.interpolate.splev कोशिश है, जो लेता है

TCK: एक दृश्य ... समुद्री मील, गुणांक, और पट्टी की डिग्री से युक्त।

जोड़ा गया: निम्नलिखित अजगर वर्ग पट्टी कार्यों बनाता है:

from scipy.interpolate import splev 
    # http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.splev.html 

class Splinefunc: 
    """ splinef = Splinefunc(knots, coefs, degree) 
     ... 
     y = splinef(x) # __call__ 

     19june untested 
    """ 

    def __init__(self, knots, coefs, degree): 
     self.knots = knots 
     self.coefs = coefs 
     self.degree = degree 

    def __call__(self, x): 
     return splev(x, (self.knots, self.coefs, self.degree)) 
+0

नहीं, जो मुझे एक स्पलीन का मूल्यांकन करने की अनुमति देता है, यह मुझे एक यूनिवर्सेटस्लाइन ऑब्जेक्ट को फिर से बनाने की अनुमति नहीं देता है। –

3

आप यह कर सकते हैं: (समुद्री मील, coefs, डिग्री) के साथ init, तो यह सिर्फ पट्टी कार्यों UnivariateSpline(x, y, s) द्वारा बनाई तरह का उपयोग UnivariateSpline वर्ग से _eval_args() और _from_tck() फ़ंक्शंस का उपयोग करके। पहला व्यक्ति स्पिन पैरामीटर देता है, जिसे आप स्टोर कर सकते हैं और बाद में दूसरे का उपयोग करके एक समान स्पलीन ऑब्जेक्ट बना सकते हैं।

यहाँ एक उदाहरण है:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.interpolate import UnivariateSpline 

x = np.linspace(-3, 3, 50) 
y = np.exp(-x**2) + 0.1 * np.random.randn(50) 

spl1 = UnivariateSpline(x, y, s=.5) 

xi = np.linspace(-3, 3, 1000) 

tck = spl1._eval_args 

spl2 = UnivariateSpline._from_tck(tck) 

plt.plot(x, y, 'ro', ms=5, label='data') 
plt.plot(xi, spl1(xi), 'b', label='original spline') 
plt.plot(xi, spl2(xi), 'y:', lw=4, label='recovered spline') 

plt.legend() 
plt.show() 

enter image description here

संबंधित मुद्दे