scipy.interpolate.LinearNDInterpolator无限期地挂起在大型数据集上

时间:2012-09-27 10:10:35

标签: scipy interpolation

我在Python中插入一些数据,以便在常规网格上进行重新划分,以便我可以对其进行部分集成。数据表示高维参数空间的函数(目前为3,将扩展至至少5)并返回可观察量的多值函数(目前为2,将扩展为3,然后可能为数十个)。

我正在通过scipy.interpolate.LinearNDInterpolator执行插值,因为缺少任何其他明显的选项(因为我理解griddata只是调用它)。在一个小的数据集(15,000行圆柱数据)上它可以正常工作。在较大的集合(60,000+)上,该命令似乎无限期地运行。 top表示iPython使用100%CPU,终端完全没有响应,包括C-c。到目前为止,我已经离开了几个小时无济于事,最终我想通过数百万条款。

我怀疑这个问题与this ticket有关,但据说在我昨天升级的SciPy 0.10.0中打了补丁。

我的问题基本上是如何在大型数据集上执行多维插值?根据我的尝试,有一些可能的解决方案可能来自哪个地方,但我找不到任何运气。 (几个scipy的子域seem to be down ......)

这个事实对我的搜索没有帮助。
  • LinearNDInterpolator出了什么问题?或者,至少,我怎样才能找出问题所在并试图绕过悬挂?
  • 有没有办法重新插值插值,以便LinearNDInterpolator可以工作?也许是通过谨慎地分析数据以便在部分中重新划分数据?
  • 是否有更适合此问题的其他高维内插器? (我注意到大多数SciPy的替代方案仅限于< 2D参数空间。)
  • 是否有其他方法可以将多维数据导入常规用户定义网格?这就是我想通过插值来做的...

1 个答案:

答案 0 :(得分:4)

问题很可能是您的数据集太大,因此计算其Delaunay三角剖分并不能在合理的时间内完成。使用从完整数据集中随机选取的较小数据子集检查scipy.spatial.Delaunay的时间缩放,以估计完整数据集计算是否在Universe结束之前完成。

如果您的原始数据位于矩形网格上,例如

v[i,j,k,l] = f(x[i], y[j], z[k], u[l])

然后使用基于三角测量的插值非常低效。最好使用张量乘积​​插值,即通过1-D插值方法连续插值每个维度:

import numpy as np
from scipy.interpolate import interp1d

def interp3(x, y, z, v, xi, yi, zi, method='cubic'):
    """Interpolation on 3-D. x, y, xi, yi should be 1-D
    and z.shape == (len(x), len(y), len(z))"""
    q = (x, y, z)
    qi = (xi, yi, zi)
    for j in range(3):
        v = interp1d(q[j], v, axis=j, kind=method)(qi[j])
    return v

def somefunc(x, y, z):
    return x**2 + y**2 - z**2 + x*y*z

# some input data
x = np.linspace(0, 1, 5)
y = np.linspace(0, 2, 6)
z = np.linspace(0, 3, 7)
v = somefunc(x[:,None,None], y[None,:,None], z[None,None,:])

# interpolate
xi = np.linspace(0, 1, 45)
yi = np.linspace(0, 2, 46)
zi = np.linspace(0, 3, 47)
vi = interp3(x, y, z, v, xi, yi, zi)

import matplotlib.pyplot as plt
plt.subplot(121)
plt.pcolor(xi, yi, vi[:,:,12])
plt.title('interpolated')
plt.subplot(122)
plt.pcolor(xi, yi, somefunc(xi[:,None], yi[None,:], zi[12]))
plt.title('exact')
plt.show()

如果您的数据集分散且对于基于三角测量的方法而言太大,则需要切换到其他方法。一些选项是同时处理少量最近邻居的插值方法(可以使用k-d树快速检索此信息)。反距离称重就是其中之一,但它可能是最糟糕的一种 - 有可能有更好的选择(如果没有进一步的研究,我不知道)。

相关问题