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的工作原理:
您将xy传递到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

08-24 23:20