2013-06-04 13 views
6

Sto usando scipy.interpolate.UnivariateSpline per interpolare senza problemi una grande quantità di dati. Funziona alla grande. Ottengo un oggetto che si comporta come una funzione.utilizzando l'output di scipy.interpolate.UnivariateSpline in seguito in python o in Matlab senza necessità di datapoint originali

Ora voglio salvare i punti della spline per dopo e usarli in Matlab (e anche in Python, ma è meno urgente), senza aver bisogno dei dati originali. Come posso fare questo?

In scipy non ne ho idea; UnivariateSpline non sembra offrire un costruttore con i nodi e i coefficienti precedentemente calcolati.

In MATLAB, ho provato le funzioni Matlab spline() e pchip(), e mentre entrambi si avvicinano, hanno errori vicino gli endpoint che sembrano un po 'come Gibbs ears.

Ecco una serie campione di dati che ho, in formato Matlab:

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

I coefficienti ei nodi sono il risultato della chiamata get_coeffs() e get_knots() sul SciPy UnivariateSpline. I valori 'Y' sono i valori della UnivariateSpline ai nodi, o più precisamente:

y = f(f.get_knots()) 

dove f è la mia UnivariateSpline.

Come posso utilizzare questi dati per creare una spline che corrisponda al comportamento di UnivariateSpline, senza dover utilizzare la casella degli strumenti Curve-Fitting? Non ho bisogno di fare alcun adattamento dati in Matlab, ho solo bisogno di sapere come costruire una spline cubica da nodi/coefficienti/valori spline.

+0

non so se questo aiuta, ma un oggetto 'UnivariateSpline' almeno sembra essere pickleable, nel caso in cui si volesse riutilizzare la tua misura in Python. –

+0

Una risposta dettagliata alla domanda dell'OP è pubblicata su http://stackoverflow.com/questions/22488637/getting-spline-equation-from-univariatespline-object/25330648#25330648. Questa risposta fornisce un mezzo per valutare manualmente i nodi e i coefficienti della spline, in modo che l'OP possa cercare di abbinarli agli input utilizzati da altri programmi. – nzh

risposta

1

In SciPy, provare scipy.interpolate.splev, che prende

TCK: una sequenza contenente la ... nodi, coefficienti, e il grado della spline.

Aggiunto: la seguente classe di pitone crea funzioni spline: init con (nodi, coefs, grado), quindi utilizzarlo proprio come funzioni spline create da UnivariateSpline(x, y, s):

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

no, che mi consente solo di valutare una spline, non mi permette di ricreare un oggetto UnivariateSpline. –

3

si può fare utilizzando le funzioni _eval_args() e dalla classe UnivariateSpline. Il primo restituisce i parametri spline, che è possibile memorizzare e successivamente creare un oggetto spline simile utilizzando il secondo.

Ecco un esempio:

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