scipy.interpolate.

griddata#

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

內插非結構化 D 維度資料。

參數:
points2 維浮點數 ndarray,形狀為 (n, D),或長度為 D 的 1 維 ndarray 元組,形狀為 (n,)。

資料點座標。

values浮點數或複數 ndarray,形狀為 (n,)

資料值。

xi2 維浮點數 ndarray,形狀為 (m, D),或長度為 D 的 ndarray 元組,可廣播到相同形狀。

要內插資料的點。

method{‘linear’, ‘nearest’, ‘cubic’},選用

內插方法。選項之一

nearest

傳回最接近內插點的資料點的值。請參閱 NearestNDInterpolator 以取得更多詳細資訊。

linear

將輸入點集細分為 N 維單體,並在每個單體上線性內插。請參閱 LinearNDInterpolator 以取得更多詳細資訊。

cubic (1-D)

傳回從三次樣條曲線決定的值。

cubic (2-D)

傳回從分段三次、連續可微分 (C1) 且近似曲率最小化的多項式表面決定的值。請參閱 CloughTocher2DInterpolator 以取得更多詳細資訊。

fill_value浮點數,選用

用於填補輸入點的凸包外部請求點的值。如果未提供,則預設值為 nan。「nearest」方法不受此選項影響。

rescale布林值,選用

在執行內插之前,將點重新縮放到單位立方體。如果某些輸入維度具有不可比較的單位且相差多個數量級,則這很有用。

在 0.14.0 版本中新增。

傳回值:
ndarray

內插值陣列。

另請參閱

LinearNDInterpolator

N 維度中的分段線性內插器。

NearestNDInterpolator

N 維度中的最近鄰內插器。

CloughTocher2DInterpolator

2D 中分段三次、C1 平滑、曲率最小化的內插器。

interpn

在規則網格或線性網格上內插。

RegularGridInterpolator

任意維度中規則或線性網格上的內插器 (interpn 包裝了此類別)。

註解

在 0.9 版本中新增。

注意

對於規則網格上的資料,請改用 interpn

範例

假設我們想要在 [0, 1]x[0, 1] 的網格上內插 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