手动Python插值



我想像np.interp()那样对我的数据进行线性插值,但我使用的机器没有numpy或scipy(我无权安装它们(。有人知道手动编码这个对讲机功能的方法吗?

我的想法是作为输入给出:x和y以及inter_points:

x=[0,1,2,3,4,5]
y=[0,2,4,6,8,10]
interp_points=[0.5,3.5]

作为输出:

[1,7]

这是我现在写的东西。这是有效的,但我认为可能有更好的方法来找到我的分数的左右边界。

x = [0,1,2,3,4,5]
y = [0,2,4,6,8,10]
interp_points=[0.5,3.5]
result=[]
for element in interp_points:
left=0
right=len(x)-1
while element>x[left]:
left+=1
while element<x[right]:
right-=1
if left==right:
result.append(y[left])
else:
result.append(y[left-1]+((element-x[left-1])*(y[right+1]-y[left-1]))/(x[right+1]-x[left-1]))
print(result)

我会遍历x坐标,找到一对如此昂贵的<xsearched<xcurrent,同时也可以遍历y坐标,zip()可以为您做到这一点。然后在已定位的线段内进行插值,然后完成。

x = [0,1,2,3,4,5]
y = [0,2,4,6,8,10]
def thing(xs,ys,x0):
for x,y in zip(xs,ys):
if x==x0:       # <- exact "hit"
return y
if x>x0:        # px<x0<x - assuming there was a px already
return py+(y-py)*(x0-px)/(x-px)
px=x
py=y
for test in [0.5,3.5]:
print(thing(x,y,test))

如果xsearched不在所提供的第一个和最后一个坐标之间,则此代码将很乐意终止。

在您要查找的数字下面查找最接近的数字,在上面查找最接近数字:

p = 1.5
x1 = max([i for i in x if i < p])
x2 = min([i for i in x if i > p])

查找这些位置的索引:

x1_i = [i for i in range(len(x)) if i == x1][0]
x2_i = [i for i in range(len(x)) if i == x2][0]

查找相应的y值:

y1 = y[x1_i]
y2 = y[x2_i]

使用线性积分公式计算答案:

y_interp = y1 + (p-x1)*((y2-y1)/(x2-x1))

将其封装在一个函数中:

def interp1d(x, y, p):
x1 = max([i for i in x if i < p])
x2 = min([i for i in x if i > p])
x1_i = [i for i in range(len(x)) if i == x1][0]
x2_i = [i for i in range(len(x)) if i == x2][0]
y1 = y[x1_i]
y2 = y[x2_i]
y_interp = y1 + (p-x1)*((y2-y1)/(x2-x1))
return y_interp

测试:

interp1d(x, y, 1.5)
Out: 3.0

现在您可以将其应用为列表理解:

[interp1d(x, y, i) for i in interp_points]
Out: [1.0, 7.0]

您可能想添加更多的错误检查,但通常可以使用,不需要外部库。

最新更新