scipy.interpolate.

griddata#

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

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

参数:
points形状为 (n, D) 的浮点数 2-D NdArray,或形状为 (n,) 的一组广播成同一形状的 1-D NdArrays。

数据点坐标。

values形状为 (n,) 的浮点数或复数 NdArray。

数据值。

xi形状为 (m, D) 的 2-D 浮点数 NdArray,或一组形状可以广播成同一种形状的 NdArray。

插值数据点的点。

method{‘linear’, ‘nearest’, ‘cubic’},可选

插值方法。下列之一

nearest

返回距离插值点最近的数据点的值。更多详细信息,请参阅 NearestNDInterpolator

linear

将输入点集细分为 N 维单纯形,并在每个单纯形上进行线性插值。更多详情,请参阅 LinearNDInterpolator

cubic (1 维)

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

cubic (2 维)

返回由分段三次、连续可微 (C1) 且近似是曲率最小的多项式曲面确定的值。更多详情,请参阅 CloughTocher2DInterpolator

fill_valuefloat,可选

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

rescalebool,可选

在执行插值前将点调整为单位立方体。如果部分输入维度的单位不可公度且数量级相差很大,此选项很有用。

在版本 0.14.0 中添加。

返回:
ndarray

插值值的数组。

另请参阅

LinearNDInterpolator

N 维分段线性插值器。

NearestNDInterpolator

N 维最近邻插值器。

CloughTocher2DInterpolator

C1 光滑、曲率最小的 2 维分段三次插值器。

interpn

在规则网格或直边网格上进行插值。

RegularGridInterpolator

在任意维度的规则网格或直边网格上的插值器(interpn 将在此类中包装)。

备注

在版本 0.9 中添加。

注意

如果数据位于规则网格上,则应改用 interpn

示例

假设我们要插值以下 2 维函数

>>> import numpy as np
>>> 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