import numpy as np
from scipy.interpolate import interp1d
x = np.array([ 0, 0, 0, 0, 0, 30])
time = np.array([ 5, 5, 10, 10, 10, 20])
intx = interp1d(time,x,'linear', 0, True, False, 0)
print intx([4,5,5,6,10,11,20, 20.0001])
>>> [ 0. nan nan 0. 0. 3. 30. 0.]
正如你所看到的,在所有情况下,除了时间值=第一对值之外,内插器返回实数。
我知道numpy.unique(),这只是一个学术问题。这是蟒蛇蟒蛇2.7运行在IPython。
谢谢!
最佳答案
您的问题是,您试图插入间隔之外的点,这导致当scipy.interpolate.interp1d
尝试计算两点之间的坡度时,它会启动一个RuntimeWarning
(发生在第416行周围的interpolate.py中):
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
值,在其中评估“cc>”,并执行以下步骤:找到原始数据中的哪一个,插入的值将被插入。
>>> x_new_indices = np.searchsorted(x, X)
剪辑x_新的_指数,使其在
x_new
指数范围内,且至少为1。消除f
的错误插值>>> x_new_indices = x_new_indices.clip(1, len(x)-1).astype(int)
计算每个
x
值所在区域的斜率。>>> 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[n] = x[0]
中每个条目的实际值。>>> slope = (y_hi - y_lo) / (x_hi - x_lo)[:, None]
>>> y_new = slope*(x_new - x_lo)[:, None] + y_lo