如何制作一个" Callable函数"

时间:2014-12-21 18:00:05

标签: 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)]
    ans =  round(ans,2)
    return ans

这给了我想要的东西,所以我可以输入:

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

我该怎么做呢?我环顾四周但似乎找不到任何东西,因为我觉得它真的很微不足道但我只是错过了一些东西。

5 个答案:

答案 0 :(得分:13)

使用functools.partial

from functools import partial

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

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

答案 1 :(得分:3)

interpolate.interp1d返回一个可调用的:

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值捕捉到附近的网格点,但一般情况下你不会想要这样做,因为{{ 1}}在没有它的情况下为您提供更好的线性插值。

答案 2 :(得分:2)

也许是这样的?

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是否足以说出代码是否正确。

答案 3 :(得分: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_from_data在范围内。

答案 4 :(得分:1)

更通用的方法是使用__call__方法创建一个类,如下所示:

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)