numpy.interp
是非常方便和相对快速的。在某些情况下,我想将它的输出与一个非插值变量进行比较,其中稀疏值被传播(在“更密集的”输出中),结果是稀疏输入之间的分段常数。我想要的函数也可以称为“稀疏->稠密”转换器,它复制最新的稀疏值,直到找到后来的值为止(一种空插值,就好像从前面的值过去了零时间/距离一样)。
不幸的是,要调整numpy.interp
的源代码并不容易,因为它只是编译函数的包装器。我可以使用Python循环自己编写这个程序,但是我希望找到一种C速度的方法来解决这个问题。
更新:下面的解决方案(scipy.interpolate.interp1d
和kind='zero'
)非常慢,每次调用需要超过10秒(例如输入长度为500 K,即填充了50% )。它使用零阶样条实现kind='zero'
,对spleval
的调用非常慢。然而,kind='linear'
的源代码(即默认的内插)提供了一个很好的模板来解决这个问题,使用的是直接的numpy (最小的改变就是设置slope=0
)。该代码展示了如何使用numpy.searchsorted
解决问题,运行时类似于调用numpy.interp
,因此问题的解决方法是调整线性插值的scipy.interpolate.interp1d
实现以跳过插值步骤(斜率!= 0混合相邻值)。
发布于 2012-09-02 16:25:48
scipy.interpolate.interp1d
可以做各种各样的插值:‘线性’,‘最近’,‘零’,‘s线性’,‘二次,’立方‘。
发布于 2016-10-07 22:25:34
为了完成这个问题:问题的解决方案是下面的代码,我在更新后的答案中给出的提示帮助下编写了这些代码:
def interpolate_constant(x, xp, yp):
indices = np.searchsorted(xp, x, side='right')
y = np.concatenate(([0], yp))
return y[indices]
发布于 2017-06-02 19:38:25
我完全同意那种=‘0’是非常慢的;对于一个数百万行的大数据集,它的速度几乎是‘线性’方法的1000倍。对于“左常量”插值--使用最新值--以下代码工作:
def approx(x, y, xout, yleft=np.nan, yright=np.nan):
xoutIdx = np.searchsorted(x, xout, side='right')-1
return (np.where(xout<x[0], yleft, np.where(xout>x[-1], yright, y[xoutIdx])))
来自R背景,这相当于R与f=0的接近。对于“右常量”插值,我还没有找到一种干净的方法,因为python的np.searchsorted =‘right’如果xout值与x中的值完全匹配,就会向后推一个索引。
https://stackoverflow.com/questions/12240634
复制相似问题