我在Python中编写样条线类。计算样条插值的方法需要最接近的x个数据点的索引。目前,简化版本如下所示:
def evaluate(x):
for ii in range(N): # N = len(x_data)
if x_data[ii] <= x <= x_data[ii+1]:
return calc(x,ii)
因此,它遍历x_data
点列表,直到找到ii
所在区间的较低索引x
,并在函数calc
中使用它,执行样条插值。虽然功能正常,但如果x_data
接近数据集的末尾,那么对于大型x
数组来说这似乎是低效的。是否有更高效或更优雅的方式来执行相同的功能,这不需要迭代地检查每个间隔?
注意:x_data
可以假设排序为x_data[ii] < x_data[ii+1]
,但不一定是等间距。
答案 0 :(得分:4)
这正是https://docs.python.org/2/library/bisect.html
的二等分from bisect import bisect
index = bisect(x_data,x)
#I dont think you actually need the value of the 2 closest but if you do here it is
point_less = x_data[index-1] # note this will break if its index 0 so you probably want a special case for that
point_more = x_data[index]
closest_value = min([point_less,point_more],key=lambda y:abs(x-y))
或者你应该使用二进制搜索(实际上我非常确定这是bisect在引擎盖下使用的内容)....它应该是最坏的情况O(log n)
(假设您的输入数组已经排序)