4

我在 Python 中插入一些数据以在常规网格上重新网格化,以便我可以部分集成它。数据表示一个高维参数空间的函数(目前为 3,将扩展到至少 5 个)并返回可观察的多值函数(目前为 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 参数空间。)
  • 还有其他方法可以将多维数据放到常规用户定义的网格中吗?这就是我试图通过插值来做的一切......
4

1 回答 1

5

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

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

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

那么使用基于三角测量的插值是非常低效的。最好使用张量积插值,即通过一维插值方法对每个维度进行连续插值:

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()

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

于 2012-09-30T16:13:25.423 回答