scipy.interpolate.griddata

scipy.interpolate.griddata(points, values, xi, method='linear', fill_value=nan, rescale=False)[源代码]

对非结构化的D-D数据进行插值。

参数
points形状为(n,D)的二维ndarray,或形状为(n,)的长度为D的一维ndarray元组。

数据点坐标。

values浮点或复线,形状(n,)

数据值。

xi具有形状(m,D)或长度为D的可广播到相同形状的ndarray元组的二维ndarray。

要插值数据的点。

method{‘线性’,‘最近’,‘立方’},可选

插值法。其中之一

nearest

返回距离插值点最近的数据点的值。看见 NearestNDInterpolator 了解更多详细信息。

linear

将输入点设置细分为N维简化,并在每个单纯形上进行线性插值。看见 LinearNDInterpolator 了解更多详细信息。

cubic (一维)

返回由三次样条确定的值。

cubic (2-D)

返回从分段三次、连续可微(C1)且近似曲率最小化的多项式曲面确定的值。看见 CloughTocher2DInterpolator 了解更多详细信息。

fill_value浮动,可选

用于填充输入点凸包外部的请求点的值。如果未提供,则默认值为 nan 。此选项对“最近”方法无效。

rescale布尔值,可选

在执行插值之前,重缩放指向单位立方体。如果某些输入尺寸具有不可公度的单位,并且相差许多量级,则此选项非常有用。

0.14.0 新版功能.

退货
ndarray

插值数组。

参见

LinearNDInterpolator

N维分段线性插值。

NearestNDInterpolator

N维最近邻插值。

CloughTocher2DInterpolator

分段三次,C1光滑,2D中曲率最小化插值。

注意事项

0.9 新版功能.

示例

假设我们要对二维函数进行插值

>>> def func(x, y):
...     return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2

在中的栅格上 [0, 1] X [0, 1]

>>> grid_x, grid_y = np.mgrid[0:1:100j, 0:1:200j]

但我们只知道它在1000个数据点的值:

>>> rng = np.random.default_rng()
>>> points = rng.random((1000, 2))
>>> values = func(points[:,0], points[:,1])

这可以通过以下方式完成 griddata --下面我们将尝试所有的插值方法:

>>> from scipy.interpolate import griddata
>>> grid_z0 = griddata(points, values, (grid_x, grid_y), method='nearest')
>>> grid_z1 = griddata(points, values, (grid_x, grid_y), method='linear')
>>> grid_z2 = griddata(points, values, (grid_x, grid_y), method='cubic')

可以看到,所有方法都在一定程度上重现了准确的结果,但对于此光滑函数,分段三次插值提供了最好的结果:

>>> import matplotlib.pyplot as plt
>>> plt.subplot(221)
>>> plt.imshow(func(grid_x, grid_y).T, extent=(0,1,0,1), origin='lower')
>>> plt.plot(points[:,0], points[:,1], 'k.', ms=1)
>>> plt.title('Original')
>>> plt.subplot(222)
>>> plt.imshow(grid_z0.T, extent=(0,1,0,1), origin='lower')
>>> plt.title('Nearest')
>>> plt.subplot(223)
>>> plt.imshow(grid_z1.T, extent=(0,1,0,1), origin='lower')
>>> plt.title('Linear')
>>> plt.subplot(224)
>>> plt.imshow(grid_z2.T, extent=(0,1,0,1), origin='lower')
>>> plt.title('Cubic')
>>> plt.gcf().set_size_inches(6, 6)
>>> plt.show()
../../_images/scipy-interpolate-griddata-1.png