【问题标题】:Quadratic or cubic 1d interpolate without large interpolator-building overhead?没有大量插值构建开销的二次或三次一维插值?
【发布时间】:2018-05-07 17:47:45
【问题描述】:

我想在 1d 中对一长串浮点数(或向量)进行四边形或立方体内插,其中 long 可以是 1E+05 或 1E+06(或更多)。出于某种原因,SciPi 方便的 interp1d() 准备插值器的时间开销对于二次和三次样条曲线几乎都为 n^3。

我不一定需要样条插值器。我可以相当容易地编写一个(至少对于等距数据),它只使用最近的 3 或 4 个点来进行局部(分段)二次或三次插值,尽管它最终可能会变得丑陋并且可能很慢。

但我想知道这样的东西是否已经存在?比interp1d 的样条生成速度更快?

使用 scipy v.0.17.0 和 numpy v.1.13.0

使用(我认为是)最近安装的 Anaconda:scipy v.0.17.0 和 numpy v.1.11.0

import time
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d

times = []
for n in np.logspace(1, 3.5, 6).astype(int):
    x = np.arange(n, dtype=float)
    y = np.vstack((np.cos(x), np.sin(x)))
    start = time.clock()
    bob = interp1d(x, y, kind='quadratic', assume_sorted=True)
    times.append((n, time.clock() - start))

n, tim = zip(*times)

plt.figure()
plt.plot(n, tim)
plt.xscale('log')
plt.yscale('log')
plt.show()

【问题讨论】:

  • 在我平庸的笔记本电脑上,output of your script 看起来非常不同。没有看到这个样条线创建成本。
  • @FTP 我忘了指定python 2.7(我的错)。我想知道您的迭代器是否还没有迭代?
  • 我不知道怎么做,但为了确保没有作弊,我插入了print(bob(0.5)) - 所以显然对 bob 进行了评估。结果相同。
  • @FTP 好吧,也许它们是“及时”迭代的,所以你必须做 z = bob(x+0.1) 这会生成 所有可能的部分样条(或样条)的。我假设您使用的 numpy 和 scipy 版本比我现在使用的要新?
  • 是的,我正在使用最新的 Anaconda 设置。我还在 colab.research.google.com 上进行了测试,结果与我的本地设置相似。

标签: python python-2.7 numpy scipy


【解决方案1】:

由于某种原因,SciPi 方便的 interp1d() 用于准备插值器的时间开销对于二次和三次样条曲线几乎都为 n^3。

据此answer:

简答:更新您的 scipy 安装。

更长的答案:在 0.19 之前,interp1d 基于 splmake,它使用具有完整矩阵的线性代数。在 scipy 0.19 中,它被重构为使用带状线性代数。结果,(下面是scipy 0.19.1)

所以你的问题的答案:

二次或三次一维插值,无需大量插值器构建开销?

仍在使用scipy.interp1d,只是不是您(在这种情况下是我)使用的旧版本的 scipy。请务必使用 scipy 0.19 或更高版本。 Fyi 1.0 版本已经发布,所以你(我)应该相应地更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多