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

War*_*ick 4 interpolation scipy

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

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

我怀疑这个问题与这张票有关,但据说是在 SciPy 0.10.0 中修补的,我昨天升级到了。

我的问题基本上是如何对大型数据集执行多维插值?根据我的尝试,解决方案可能来自几个可能的地方,但我没有运气找到它们。(由于 scipy 的几个子域似乎已关闭,这对我的搜索没有帮助......)

  • 怎么了LinearNDInterpolator?或者,至少,我怎样才能找出问题所在并尝试绕过绞刑?
  • 有没有办法重新制定插值,以便LinearNDInterpolator有效?也许通过谨慎地将数据分块以重新划分数据?
  • 是否有其他更适合该问题的高维插值器?(我注意到 SciPy 的大多数替代方案都仅限于 <2D 参数空间。)
  • 是否有其他方法可以将多维数据放到常规用户定义的网格上?这就是我试图通过插值来做的...

pv.*_*pv. 5

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

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

v[i,j,k,l] = f(x[i], y[j], z[k], u[l])
Run Code Online (Sandbox Code Playgroud)

那么使用基于三角剖分的插值是非常低效的。最好使用tensor-product插值,即通过一维插值方法依次对每个维度进行插值:

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()
Run Code Online (Sandbox Code Playgroud)

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