“大”数据集的Sane立方插值,替代interp1d?

时间:2011-12-28 17:51:49

标签: scipy spline

我正在处理音频数据,因此我的数据集通常在40000到120000点左右(1到3秒)。目前我正在使用线性插值来完成某些任务,我想使用三次插值来改善一些结果。

我一直在使用interp1dkind='linear'来生成插值函数。这非常有效且非常直观。

然而,当我切换到kind='cubic'时,我的电脑变得疯狂 - 内存开始抖动,Emacs窗口变暗,鼠标指针开始移动非常缓慢,硬盘驱动器变得非常活跃。我认为这是因为它使用了大量内存。我被迫(非常慢)打开一个新的终端窗口,运行htop,并终止Python进程。 (我应该提到我正在使用Linux。)

我对三次插值的理解是它一次只需要检查数据集的5个点,但这可能是错误的。

在任何情况下,我怎样才能最轻松地从线性插值切换到立方插值而不会触及这个明显的内存使用情况? interp1d的所有示例都使用非常少的数据点,并且在文档中的任何地方都没有提到它对于更高的订单表现不佳,因此我不知道接下来要尝试什么。

编辑:我刚试过UnivariateSpline,这几乎是我正在寻找的。问题是插值不会触及所有数据点。我正在寻找能够生成通过所有数据点的平滑曲线的东西。

Edit2:看起来InterpolatedUnivariateSpline可能就是我想要的。

1 个答案:

答案 0 :(得分:1)

我在ND插值中遇到了类似的问题。我的解决方案是将数据拆分为域并为每个域构建插值函数。

在您的情况下,您可以将数据分成500个点,并根据您的位置进行插值。

f1 = [0,...495]
f2 = [490,...,990]
f3 = [985,...,1485]
..
.
.
.

等等。

还要确保每个功能的间隔重叠。在这个例子中, 重叠是5分。我猜你必须做一些实验才能看出最佳重叠是什么。

我希望这会有所帮助。