我正在尝试编写一个内插一些数据的函数,然后你可以选择x轴上的任何值来找到y轴上的相应点。
例如:
f = f_from_data([3, 4, 6], [0, 1, 2])
print f(3.5)
产生答案
0.5
我遇到了一个看起来像这样的答案:
def f_from_data(xs,ys):
return scipy.interpolate.interp1d(xs, ys)
有人可以解释一下这是如何运作的吗?我理解interp1d,但我不确定这段简单的代码如何能够得到答案,例如
print f(5)
输入。
答案 0 :(得分:2)
一个简单的例子可能有所帮助。 interp1d
是一个类似函数的类。它不返回数字,而是返回另一个类似函数的对象。再次调用它后,它会在x的输入值处返回y的插值。您也可以为此功能提供单点或整个数组:
import numpy as np
from scipy.interpolate import interp1d
X=[3,4,6]
Y=[0,1,2]
f = interp1d(X,Y, bounds_error=False)
print f(3.5)
X2 = np.linspace(3, 6, 5)
print X2
print f(X2)
0.5
[ 3. 3.75 4.5 5.25 6. ]
[ 0. 0.75 1.25 1.625 2. ]
答案 1 :(得分:1)
This class returns a function whose call method uses interpolation
to find the value of new points.
因此,使用x
值调用返回的函数会得到相应的插值y
值。
答案 2 :(得分:1)
您的示例使用线性插值 - 数据点之间的直线连接。
因此,对于您的给定数据(xs = [3, 4, 6]
和ys = [0, 1, 2]
),该函数看起来像
其中蓝点是输入数据,绿线是插值函数,红点是测试点f(3.5) == 0.5
计算f(5.0)
:
首先,您必须找出您所在的细分市场。
x == 5
位于第二段,介于4到6之间,因此我们在点C (5, y)
和A (4, 1)
之间寻找点B (6, 2)
。
C
就行,AC = k * AB
其中0. <= k < 1.
;这给了我们两个未知数的方程(k
和y
)。解决,我们得到
y = Ay + (By - Ay) * (Cx - Ax) / (Bx - Ax)
并加入,
y = 1. + (2. - 1.) * (5. - 4.) / (6. - 4.)
= 1.5
因此插值点为C (5, 1.5)
,函数返回f(5.0) = 1.5
从上面开始,您应该可以编写自己的f()
函数给定xs
和ys
;这正是scipy.interpolate.interp1d(xs, ys)
所做的 - 取xs
和ys
并返回插值函数,即
f = scipy.interpolate.interp1d([3, 4, 6], [0, 1, 2])
# f is now a function that you can call, like
f(5.0) # => 1.5