Python 如何制作一个;“可调用函数”;

Python 如何制作一个;“可调用函数”;,python,numpy,callable,Python,Numpy,Callable,我目前正在编写一个名为f_from_data的python定义,该定义使用了一条直线上的插值查找点,到目前为止,我已经编写了以下内容: def f_from_data(xs, ys, x): xfine = np.linspace(min(xs), max(xs), 10000) y0 = inter.interp1d(xs, ys, kind = 'linear') ans = (y0(xfine))[numpy.searchsorted(xfine, x)]

我目前正在编写一个名为f_from_data的python定义,该定义使用了一条直线上的插值查找点,到目前为止,我已经编写了以下内容:

def f_from_data(xs, ys, x):
    xfine = np.linspace(min(xs), max(xs), 10000)
    y0 = inter.interp1d(xs, ys, kind = 'linear')
    ans = (y0(xfine))[numpy.searchsorted(xfine, x)]
    ans =  round(ans,2)
    return ans
这给了我想要的东西,我需要这样才能进入:

f = f_from_data([3, 4, 6], [0, 1, 2])
print f(3)
>>>0.0

我该怎么做呢?我环顾四周,但似乎找不到任何东西,因为我认为这真的很琐碎,但我只是错过了一些东西。

使用
functools。部分

from functools import partial

f = partial(f_from_data, [3, 4, 6], [0, 1, 2])

partial
将创建一个已设置前两个参数的可调用对象。

可能是这样的吗

def f_from_data(xs, ys):
    def interpolate(x):
       xfine = np.linspace(min(xs), max(xs), 10000)
       y0 = inter.interp1d(xs, ys, kind = 'linear')
       ans = (y0(xfine))[numpy.searchsorted(xfine, x)]
       ans =  round(ans,2)
       return ans
    return interpolate
警告-我对matplotlib不太了解,无法判断代码是否正确。

返回一个可调用的:

import scipy.interpolate as interpolate

f_from_data = interpolate.interp1d
f = f_from_data([3, 4, 6], [0, 1, 2])
print(f(3))
屈服

0.0

由于可以将
f_from_data
指定给
interpolate.interp1d
,因此您可能根本不需要
f_from_data
。现在,这确实不会将x范围分割为10000个网格点,并使用searchsorted将x值捕捉到附近的网格点,但通常情况下,您不会希望这样做,因为
interp1d
提供了一个更好的线性插值,而不使用它。

更通用的方法是使用
\uuuuu调用\uuuu
方法创建一个类,如下所示:

class f_from_data(object):
    def __init__(self, xs, ys):
        self.xfine = np.linspace(min(xs), max(xs), 10000)
        self.y0 = inter.interp1d(xs, ys, kind = 'linear')
    def __call__(self, x):
        ans = (self.y0(self.xfine))[numpy.searchsorted(self.xfine, x)]
        return round(ans, 2)

如果你想要的是简单的,这里是一个简单的解决方案

>>> f = lambda x: f_from_data([3, 4, 6], [0, 1, 2], x)
>>> print f(3)
0.0
>>> 
如果您不喜欢
lambda

>>> def f(x): return f_from_data([3, 4, 6], [0, 1, 2], x)

在这两种情况下,当您定义辅助函数时,必须确保
f\u from\u data
在范围内。

虽然这在其他上下文中可能很常见,但在numpy代码中却极不寻常。是什么让它在numpy代码中不寻常?这是一种方法,例如,
scipy.interpolate
使其所有函数返回1D插值器工作,请参见,
numpy.poly1d
如何处理多项式求值函数,请参见,或
numpy.vectorize
使向量化函数工作,请参见。仅供参考,此过程称为。