【发布时间】:2012-09-02 23:41:57
【问题描述】:
numpy.interp 很方便,也比较快。在某些情况下,我想将其输出与传播稀疏值(在“更密集”输出中)的非插值变体进行比较,结果在稀疏输入之间是分段常数。我想要的函数也可以称为“稀疏 - > 密集”转换器,它复制最新的稀疏值,直到找到后面的值(一种空插值,就好像从早期的值过去了零时间/距离)。
不幸的是,调整numpy.interp 的源代码并不容易,因为它只是一个已编译函数的包装。我可以使用 Python 循环自己编写此代码,但希望找到一种 C 速度的方法来解决问题。
更新:下面的解决方案(scipy.interpolate.interp1d 和 kind='zero')非常慢,每次调用需要超过 10 秒(例如,输入 500k 的长度,填充了 50%)。它使用零阶样条实现kind='zero',并且对spleval 的调用非常慢。但是,kind='linear' 的源代码(即默认插值)提供了一个很好的模板,可以使用直接 numpy 解决问题(最小的更改是设置slope=0)。该代码显示了如何使用numpy.searchsorted 解决问题,运行时类似于调用numpy.interp,因此通过调整线性插值的scipy.interpolate.interp1d 实现以跳过插值步骤(斜率!= 0 blends相邻的值)。
【问题讨论】:
-
只是想对更新表示感谢 - 我想要使用
numpy进行零插值,而不完全依赖于scipy,并且您的帖子更新指出了这样做的方法。在我完成的一个小测试中,numpy1.5.1: installed 0.8.0scipy和_fitpack.so在 308 到 508 μs 内完成了我的测试;而numpy-only hacked linear withslope=0在 491 到 778 μs 内执行相同的操作 - 所以对我来说它更慢;但不是那么多!再次感谢 - 干杯!
标签: python numpy interpolation