【问题标题】:What is the best drop-in replacement for numpy.interp if I want the null interpolation (piecewise constant)?如果我想要空插值(分段常数),numpy.interp 的最佳替代品是什么?
【发布时间】:2012-09-02 23:41:57
【问题描述】:

numpy.interp 很方便,也比较快。在某些情况下,我想将其输出与传播稀疏值(在“更密集”输出中)的非插值变体进行比较,结果在稀疏输入之间是分段常数。我想要的函数也可以称为“稀疏 - > 密集”转换器,它复制最新的稀疏值,直到找到后面的值(一种空插值,就好像从早期的值过去了零时间/距离)。

不幸的是,调整numpy.interp 的源代码并不容易,因为它只是一个已编译函数的包装。我可以使用 Python 循环自己编写此代码,但希望找到一种 C 速度的方法来解决问题。

更新:下面的解决方案(scipy.interpolate.interp1dkind='zero')非常慢,每次调用需要超过 10 秒(例如,输入 500k 的长度,填充了 50%)。它使用零阶样条实现kind='zero',并且对spleval 的调用非常慢。但是,kind='linear' 的源代码(即默认插值)提供了一个很好的模板,可以使用直接 numpy 解决问题(最小的更改是设置slope=0)。该代码显示了如何使用numpy.searchsorted 解决问题,运行时类似于调用numpy.interp,因此通过调整线性插值的scipy.interpolate.interp1d 实现以跳过插值步骤(斜率!= 0 blends相邻的值)。

【问题讨论】:

  • 只是想对更新表示感谢 - 我想要使用 numpy 进行零插值,而不完全依赖于 scipy,并且您的帖子更新指出了这样做的方法。在我完成的一个小测试中,numpy 1.5.1: installed 0.8.0 scipy_fitpack.so 在 308 到 508 μs 内完成了我的测试;而numpy-only hacked linear with slope=0 在 491 到 778 μs 内执行相同的操作 - 所以对我来说它更慢;但不是那么多!再次感谢 - 干杯!

标签: python numpy interpolation


【解决方案1】:

scipy.interpolate.interp1d 可以进行各种插值:“线性”、“最近”、“零”、“线性”、“二次”、“三次”。

请查看文档:http://docs.scipy.org/doc/scipy-0.10.1/reference/generated/scipy.interpolate.interp1d.html#scipy.interpolate.interp1d

【讨论】:

  • 不幸的是,每次更新问题都很慢。这是一个完全有效的答案,但底层的 Spline 实现效率不高。
【解决方案2】:

只是为了完成:问题的解决方案是以下代码,我可以借助更新答案中给出的提示编写该代码:

def interpolate_constant(x, xp, yp):
    indices = np.searchsorted(xp, x, side='right')
    y = np.concatenate(([0], yp))
    return y[indices]

【讨论】:

    【解决方案3】:

    我完全同意 kind='zero' 非常慢;对于数百万行的大型数据集,它可能比“线性”方法慢 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 时的近似值。我还没有找到一种干净的方法来执行“右常数”插值,因为如果 xout 值与 x 中的值完全匹配,python 的 np.searchsorted with side='right' 会推回一个索引...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2014-01-15
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      相关资源
      最近更新 更多