我目前正在编写一个名为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
我该怎么做呢?我环顾四周但似乎找不到任何东西,因为我觉得它真的很微不足道但我只是错过了一些东西。
答案 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)