定义返回(插值)函数的函数

2024-05-16 14:09:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着写一个函数,返回一个插值函数,它在插值范围外线性外推。在看了关于咖喱的帖子后,我不明白为什么我的东西不起作用。我有:

def interpolation(X_list,a_list): 
    A1=scipy.interpolate.UnivariateSpline(
        np.asarray(X_list),
        np.asarray(a_list),
        k=3,
        s=0,
        check_finite=True)

    m=(((a_list[-1])-(a_list[-2]))
       / ((X_list[-1])-(X_list[-2])))

    A1ext= m*X+a_list[-1]-m*X_list[-1]

    def a(X):
        if X_list[-1]>=X:
            return A1
        if X>X_list[-1]:
            return A1ext
    return a(X)

Tags: 函数returnifdefa1np线性scipy
1条回答
网友
1楼 · 发布于 2024-05-16 14:09:04

只需返回内部函数

def interpolation(X_list,a_list): 
    A1=scipy.interpolate.UnivariateSpline(
        np.asarray(X_list),
        np.asarray(a_list),
        k=3,
        s=0,
        check_finite=True)

    m=(((a_list[-1])-(a_list[-2]))
       / ((X_list[-1])-(X_list[-2])))

    A1ext= m*X+a_list[-1]-m*X_list[-1]

    def a(X):
        if X_list[-1]>=X:
            return A1
        if X>X_list[-1]:
            return A1ext
    return a

if __name__ == '__main__':
    a = interpolation(X_list,a_list)
    a(X)

为了缩短它,可以用lambda匿名函数替换该内部函数(a):

lambda X: A1 if X_list[-1] >= X else A1ext

所以现在是:

def interpolation(X_list,a_list): 
    A1=scipy.interpolate.UnivariateSpline(
        np.asarray(X_list),
        np.asarray(a_list),
        k=3,
        s=0,
        check_finite=True)

    m=(((a_list[-1])-(a_list[-2]))
       / ((X_list[-1])-(X_list[-2])))

    A1ext= m*X+a_list[-1]-m*X_list[-1]

    return lambda X: A1 if X_list[-1] >= X else A1ext

相关问题 更多 >