免责声明:我主要是在写这篇文章时考虑到语法因素和一般行为。 我不熟悉所描述的方法的内存和CPU方面,我将这个答案的目标对准那些拥有相当小的数据集的人,这样插值的质量可能是需要考虑的主要方面。 我知道,在处理非常大的数据集时,性能更好的方法(即interp2d和griddata)可能不可行。
我将比较三种多维插值方法(interp2d / splines,interp2d和interp2d)。 我将使它们受到两种插值任务和两种底层函数(要插入的点)。 具体的例子将展示二维插值,但可行的方法适用于任意维度。 每种方法都提供各种插值; 在所有情况下,我将使用三次插值(或close1)。 重要的是要注意,无论何时使用插值,都会引入与原始数据相比的偏差,并且所使用的特定方法会影响最终的工件。 始终注意这一点,并负责任地插入。
两个插值任务将是
上采样(输入数据在矩形网格上,输出数据在更密集的网格上)
将散乱数据插值到规则网格上
这两个函数(通过域interp2d)将是
流畅友好的功能:interp2d; 范围在griddata
一个邪恶的(特别是非连续的)函数:interp2d,原点附近的值为0.5; 范围在griddata
这是他们看起来的样子:
我将首先演示这三种方法在这四种测试中的表现,然后我将详细介绍这三种方法的语法。 如果您知道对方法的期望,您可能不想浪费时间学习它的语法(看着你,interp2d)。
测试数据
为了显而易见,这里是我生成输入数据的代码。 虽然在这种特殊情况下我显然知道数据的基础功能,但我只会用它来为插值方法生成输入。 为方便起见,我使用numpy(主要用于生成数据),但仅仅scipy就足够了。
import numpy as np
import scipy.interpolate as interp
# auxiliary function for mesh generation
def gimme_mesh(n):
minval = -1
maxval = 1
# produce an asymmetric shape in order to catch issues with transpositions
return np.meshgrid(np.linspace(minval,maxval,n), np.linspace(minval,maxval,n+1))
# set up underlying test functions, vectorized
def fun_smooth(x, y):
return np.cos(np.pi*x)*np.sin(np.pi*y)
def fun_evil(x, y):
# watch out for singular origin; function has no unique limit there
return np.where(x**2+y**2>1e-10, x*y/(x**2+y**2), 0.5)
# sparse input mesh, 6x7 in shape
N_sparse = 6
x_sparse,y_sparse = gimme_mesh(N_sparse)
z