我在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
可以工作?也许是通过谨慎地分析数据以便在部分中重新划分数据?答案 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树快速检索此信息)。反距离称重就是其中之一,但它可能是最糟糕的一种 - 有可能有更好的选择(如果没有进一步的研究,我不知道)。