numpy.interp
非常方便且相对快速。在某些情况下,我想将其输出与未插值的变体进行比较,在该变体中,稀疏值会被传播(在“密集”输出中),并且结果在稀疏输入之间为分段常数。我想要的函数也可以称为“稀疏->密集”转换器,它复制最新的稀疏值,直到它找到更晚的值(一种空插值,就好像从早期值起从未经过零时间/距离)。
不幸的是,调整numpy.interp
源代码并不容易,因为它只是编译函数的包装器。我可以使用Python循环自己编写此功能,但希望找到一种C速度的方法来解决问题。
更新:下面的解决方案(使用kind ='zero'
的scipy.interpolate.interp1d
)非常慢,并且每次调用需要超过10秒钟(例如500k长度的输入,其中50%填充)。它使用零阶样条实现kind =' zero '
,并且对spleval
的调用非常缓慢。然而,kind ='linear'
(即默认插值)的源代码为使用纯numpy解决问题提供了极好的模板(最小更改是将slope = 0
)。该代码展示了如何使用numpy.searchsorted
来解决问题,运行时间类似于调用numpy.interp
,因此通过调整scipy.interpolate.interp1d
实现线性插值即可跳过插值步骤(斜率!= 0混合相邻值)。
numpy
中进行零插值,而不需要完全依赖于scipy
,而你的帖子更新指明了实现方法。在我进行的小型测试中,numpy
1.5.1:安装了0.8.0的scipy
和_fitpack.so
,测试时间为308到508微秒;而仅使用slope=0
的numpy
线性插值需要491到778微秒 - 所以对我来说它更慢了一些;但并不是太多!再次感谢 - 干杯! - sdaau