RegularGridInterpolator#
- class scipy.interpolate.RegularGridInterpolator(points, values, method='linear', bounds_error=True, fill_value=nan, *, solver=None, solver_args=None)[原始碼]#
在任意維度的規則或線性網格上進行內插。
資料必須定義在線性網格上;也就是說,一個間距均勻或不均勻的矩形網格。支援線性、最近鄰、樣條內插。在設定內插器物件後,可以在每次評估時選擇內插方法。
- 參數:
- pointsndarray 浮點數 tuple,形狀為 (m1, ), …, (mn, )
定義 n 維度規則網格的點。每個維度中的點(即 points tuple 的每個元素)必須嚴格遞增或遞減。
- valuesarray_like,形狀為 (m1, …, mn, …)
n 維度規則網格上的資料。接受複數資料。
- methodstr,可選
要執行的內插方法。支援 “linear”、“nearest”、“slinear”、“cubic”、“quintic” 和 “pchip”。此參數將成為物件
__call__
方法的預設值。預設值為 “linear”。- bounds_errorbool,可選
如果為 True,當請求內插值超出輸入資料的域時,將引發 ValueError。如果為 False,則使用 fill_value。預設值為 True。
- fill_valuefloat 或 None,可選
用於域外點的值。如果為 None,則域外的值將被外插。預設值為
np.nan
。- solvercallable,可選
僅用於方法 “slinear”、“cubic” 和 “quintic”。用於建構 NdBSpline 實例的稀疏線性代數求解器。預設值為迭代求解器
scipy.sparse.linalg.gcrotmk
。在版本 1.13 中新增。
- solver_args: dict,可選
要傳遞給 solver 的其他參數(如果有的話)。
在版本 1.13 中新增。
參見
NearestNDInterpolator
N 維度非結構化資料的最近鄰內插器
LinearNDInterpolator
N 維度非結構化資料的線性分段內插器
interpn
一個方便的函數,它封裝了
RegularGridInterpolator
scipy.ndimage.map_coordinates
在等間距網格上進行內插(適用於例如 N 維影像重新取樣)
註解
與
LinearNDInterpolator
和NearestNDInterpolator
不同,此類別透過利用規則網格結構來避免對輸入資料進行昂貴的三角剖分。換句話說,此類別假設資料定義在線性網格上。
在版本 0.14 中新增。
‘slinear’(k=1)、‘cubic’(k=3) 和 ‘quintic’(k=5) 方法是張量積樣條內插器,其中 k 是樣條次數。如果任何維度的點數少於 k + 1,則會引發錯誤。
在版本 1.9 中新增。
如果輸入資料的維度具有不可比較的單位,並且相差許多數量級,則內插器可能會出現數值假影。考慮在內插之前重新縮放資料。
為樣條方法選擇求解器
樣條方法 “slinear”、“cubic” 和 “quintic” 涉及在實例化時求解大型稀疏線性系統。根據資料,預設求解器可能足夠也可能不足夠。當它不足夠時,您可能需要試驗可選的 solver 參數,您可以在其中選擇直接求解器 (
scipy.sparse.linalg.spsolve
) 或來自scipy.sparse.linalg
的迭代求解器。您可能需要透過可選的 solver_args 參數提供額外參數(例如,您可以提供起始值或目標容差)。請參閱scipy.sparse.linalg
文件以取得可用選項的完整列表。或者,您可以改為使用舊版方法 “slinear_legacy”、“cubic_legacy” 和 “quintic_legacy”。這些方法允許更快的建構,但評估速度會慢得多。
參考文獻
[1]Johannes Buchner 的 Python 套件 regulargrid,請參閱 https://pypi.python.org/pypi/regulargrid/
[2]維基百科,“三線性內插”,https://en.wikipedia.org/wiki/Trilinear_interpolation
[3]Weiser, Alan, and Sergio E. Zarantonello. “多維分段線性及多線性表格內插的註解。” MATH. COMPUT. 50.181 (1988): 189-196. https://www.ams.org/journals/mcom/1988-50-181/S0025-5718-1988-0917826-0/S0025-5718-1988-0917826-0.pdf DOI:10.1090/S0025-5718-1988-0917826-0
範例
在 3D 網格的點上評估函數
作為第一個範例,我們在 3D 網格的點上評估一個簡單的範例函數
>>> from scipy.interpolate import RegularGridInterpolator >>> import numpy as np >>> def f(x, y, z): ... return 2 * x**3 + 3 * y**2 - z >>> x = np.linspace(1, 4, 11) >>> y = np.linspace(4, 7, 22) >>> z = np.linspace(7, 9, 33) >>> xg, yg ,zg = np.meshgrid(x, y, z, indexing='ij', sparse=True) >>> data = f(xg, yg, zg)
data
現在是一個 3D 陣列,其中data[i, j, k] = f(x[i], y[j], z[k])
。接下來,從此資料定義一個內插函數>>> interp = RegularGridInterpolator((x, y, z), data)
在兩個點
(x,y,z) = (2.1, 6.2, 8.3)
和(3.3, 5.2, 7.1)
評估內插函數>>> pts = np.array([[2.1, 6.2, 8.3], ... [3.3, 5.2, 7.1]]) >>> interp(pts) array([ 125.80469388, 146.30069388])
這確實非常接近
>>> f(2.1, 6.2, 8.3), f(3.3, 5.2, 7.1) (125.54200000000002, 145.894)
內插和外插 2D 資料集
作為第二個範例,我們內插和外插 2D 資料集
>>> x, y = np.array([-2, 0, 4]), np.array([-2, 0, 2, 5]) >>> def ff(x, y): ... return x**2 + y**2
>>> xg, yg = np.meshgrid(x, y, indexing='ij') >>> data = ff(xg, yg) >>> interp = RegularGridInterpolator((x, y), data, ... bounds_error=False, fill_value=None)
>>> import matplotlib.pyplot as plt >>> fig = plt.figure() >>> ax = fig.add_subplot(projection='3d') >>> ax.scatter(xg.ravel(), yg.ravel(), data.ravel(), ... s=60, c='k', label='data')
在更精細的網格上評估和繪製內插器
>>> xx = np.linspace(-4, 9, 31) >>> yy = np.linspace(-4, 9, 31) >>> X, Y = np.meshgrid(xx, yy, indexing='ij')
>>> # interpolator >>> ax.plot_wireframe(X, Y, interp((X, Y)), rstride=3, cstride=3, ... alpha=0.4, color='m', label='linear interp')
>>> # ground truth >>> ax.plot_wireframe(X, Y, ff(X, Y), rstride=3, cstride=3, ... alpha=0.4, label='ground truth') >>> plt.legend() >>> plt.show()
其他範例在教學文件中給出。
- 屬性:
- gridndarray 的 tuple
定義 n 維度規則網格的點。此 tuple 透過
np.meshgrid(*grid, indexing='ij')
定義完整網格- valuesndarray
網格上的資料值。
- methodstr
內插方法。
- fill_valuefloat 或
None
對於
__call__
的超出範圍參數,使用此值。- bounds_errorbool
如果
True
,超出範圍的參數會引發ValueError
。
方法
__call__
(xi[, method, nu])在座標處進行內插。