问题很可能是您的数据集太大,因此计算其 Delaunay 三角剖分无法在合理的时间内完成。检查时间缩放scipy.spatial.Delaunay
使用从完整数据集中随机挑选的较小数据子集来估计完整数据集计算是否在宇宙结束之前完成。
如果你的原始数据在矩形网格上,例如
v[i,j,k,l] = f(x[i], y[j], z[k], u[l])
那么使用基于三角测量的插值是very效率低下。最好使用张量积插值,即通过一维插值方法依次对每个维度进行插值:
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-树快速检索此信息)。反距离称重是其中之一,但它可能是最糟糕的一种——可能有更好的选择(如果没有进一步研究,我不知道)。