【发布时间】: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