稍后在python或Matlab中使用scipy.interpolate.UnivariateSpline的输出,而不需要原始数据点

稍后在python或Matlab中使用scipy.interpolate.UnivariateSpline的输出,而不需要原始数据点,python,matlab,scipy,spline,Python,Matlab,Scipy,Spline,我正在使用平滑插值大量数据。效果很好。我得到一个像函数一样的对象 现在我想保存样条曲线点以备将来使用,并在Matlab中使用它们(还有Python,但这不太紧急),而不需要原始数据。我该怎么做 在scipy我没有任何线索;单变量样条线似乎并没有提供具有先前计算的节点和系数的构造函数 在MATLAB中,我尝试了MATLAB函数和pchip(),虽然两者都很接近,但它们在端点附近有类似的错误 以下是我拥有的一组样本数据,采用Matlab格式: splinedata = struct('coeffs'

我正在使用平滑插值大量数据。效果很好。我得到一个像函数一样的对象

现在我想保存样条曲线点以备将来使用,并在Matlab中使用它们(还有Python,但这不太紧急),而不需要原始数据。我该怎么做

在scipy我没有任何线索;单变量样条线似乎并没有提供具有先前计算的节点和系数的构造函数

在MATLAB中,我尝试了MATLAB函数和
pchip()
,虽然两者都很接近,但它们在端点附近有类似的错误

以下是我拥有的一组样本数据,采用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])
系数和节点是在scipy单变量样本线上调用
get_coefs()
get_knots()
的结果。“y”值是节点处的单变量样条线的值,或者更精确地说:

 y = f(f.get_knots())
其中f是我的单变量样条线

如何使用此数据生成与单变量样条线行为匹配的样条线,而不必使用曲线拟合工具箱?我不需要在Matlab中进行任何数据拟合,我只需要知道如何从节点/系数/样条曲线值构造三次样条曲线。

在scipy中,试试看,这需要

tck:一个序列。。。包含样条曲线的节点、系数和阶数

添加:以下python类创建样条线函数: 带(节、系数、度)的初始值, 然后像使用单变量样条线(x,y,s)创建的样条线函数一样使用它:


您可以通过使用类
单变量样条线
中的函数
\u eval\u args()
\u tck()
来执行此操作。第一个参数返回样条线参数,您可以存储这些参数,然后使用第二个参数创建类似的样条线对象

以下是一个例子:

将numpy导入为np
将matplotlib.pyplot作为plt导入
从scipy.interpolate导入单变量样条线
x=np.linspace(-3,3,50)
y=np.exp(-x**2)+0.1*np.randn(50)
spl1=单变量样条线(x,y,s=.5)
席=NP.林空间(- 3, 3, 1000)
tck=spl1.\u评估\u参数
spl2=来自tck(tck)的单变量样本
plt.绘图(x,y,'ro',ms=5,label='data')
plt.plot(xi,spl1(xi),“b”,标签=”原始样条曲线')
plt.plot(xi,spl2(xi),'y:',lw=4,label='recovered spline')
plt.legend()
plt.show()

我不知道这是否有帮助,但如果您想在Python中重新使用fit,至少一个
单变量pline
对象似乎是可以pickle的。OP问题的详细答案发布在。这个答案提供了一种手动计算样条线节点和系数的方法,以便OP可以尝试将它们与其他程序使用的输入匹配。不,这只允许我计算样条线,不允许我重新创建单变量样条线对象。
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 ))