线性插值的代码python_如何实现线性插值?

我想出了一个相当优雅的解决方案(IMHO),所以我忍不住贴了出来:from bisect import bisect_left

class Interpolate(object):

def __init__(self, x_list, y_list):

if any(y - x <= 0 for x, y in zip(x_list, x_list[1:])):

raise ValueError("x_list must be in strictly ascending order!")

x_list = self.x_list = map(float, x_list)

y_list = self.y_list = map(float, y_list)

intervals = zip(x_list, x_list[1:], y_list, y_list[1:])

self.slopes = [(y2 - y1)/(x2 - x1) for x1, x2, y1, y2 in intervals]

def __getitem__(self, x):

i = bisect_left(self.x_list, x) - 1

return self.y_list[i] + self.slopes[i] * (x - self.x_list[i])

我映射到float,这样,如果x1、x2、y1和y2都是某些iterval的整数,整数除法(python&lt;=2.7)就不会启动并破坏事物。

在__getitem__中,我利用self.x_列表是按升序排序的这一事实,使用bisect_left来(非常)快速地找到self.x_list中小于x的最大元素的索引。

使用这样的类:i = Interpolate([1, 2.5, 3.4, 5.8, 6], [2, 4, 5.8, 4.3, 4])

# Get the interpolated value at x = 4:

y = i[4]

为了简单起见,我根本没有处理过边界条件。事实上,i[x]的x < 1将工作,就好像从(2.5,4)到(1,2)的线被扩展到了负无穷大,而x == 1或x > 6的i[x]将产生IndexError。最好是在所有情况下都提出索引器错误,但这留给读者作为练习。:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值