您的问题是您正在尝试对区间外的点进行插值,这会导致在尝试计算两点之间的斜率时scipy.interpolate.interp1d
启动 a (它发生在 interpolate.py 中的第 416 行附近):RuntimeWarning
slope = (y_hi - y_lo) / (x_hi - x_lo)[:, None]
查看在区间内移动点时会发生什么:
>>> import numpy as np
>>> from scipy.interpolate import interp1d
>>> x = np.array([ 5, 5, 10, 10, 10, 20])
>>> y = np.array([ 0, 0, 0, 0, 0, 30])
>>> X = np.array([5.1,5.1,5.1,6,10,11,20, 19.999])
>>> f = interp1d(x,y,'linear', 0, True, False, 0)
>>> Y = f(X)
[ 0. 0. 0. 0. 0. 3. 30. 29.997]
如果你绘制它,你会发现一切都是有道理的:
这是如何interp1d
工作的:
- 你传递
x
和y
到interp1d
它会创建一个f
可调用的方法
然后传递x_new
要评估的新值,f
它会执行以下步骤:
在原始数据中查找要插入的值的位置。
>>> x_new_indices = np.searchsorted(x, X)
剪辑 x_new_indices 使它们在x
索引范围内且至少为 1。消除错误插值x_new[n] = x[0]
>>> x_new_indices = x_new_indices.clip(1, len(x)-1).astype(int)
计算每个x_new
值所在区域的斜率。
>>> lo = x_new_indices - 1
>>> hi = x_new_indices
>>> x_lo = x[lo]
>>> x_hi = x[hi]
>>> y_lo = y[lo]
>>> y_hi = y[hi]
计算 中每个条目的实际值x_new
。
>>> slope = (y_hi - y_lo) / (x_hi - x_lo)[:, None]
>>> y_new = slope*(x_new - x_lo)[:, None] + y_lo