numpy.interp
很方便,也比较快。在某些情况下,我想将其输出与传播稀疏值(在“更密集”输出中)的非插值变体进行比较,结果在稀疏输入之间是分段常数。我想要的函数也可以称为“稀疏 - > 密集”转换器,它复制最新的稀疏值,直到找到后面的值(一种空插值,就好像从早期的值过去了零时间/距离)。
不幸的是,调整源代码并不容易,numpy.interp
因为它只是一个编译函数的包装器。我可以使用 Python 循环自己编写此代码,但希望找到一种 C 速度的方法来解决问题。
更新:下面的解决方案(scipy.interpolate.interp1d
with kind='zero'
)非常慢,每次调用需要超过 10 秒(例如输入 500k 的长度,填充了 50%)。它kind='zero'
使用零阶样条实现,调用spleval
速度非常慢。但是,(即默认插值)的源代码为kind='linear'
使用直接 numpy 解决问题提供了一个很好的模板(最小的变化是 set slope=0
)。该代码显示了如何使用numpy.searchsorted
来解决问题,并且运行时类似于调用numpy.interp
,因此通过调整scipy.interpolate.interp1d
线性插值的实现以跳过插值步骤(斜率!= 0 混合相邻值)来解决问题。