RegularGridInterpolator#
- class scipy.interpolate.RegularGridInterpolator(points, values, method='linear', bounds_error=True, fill_value=nan, *, solver=None, solver_args=None)[源代码][源代码]#
任意维度上的规则或矩形网格插值器。
数据必须在矩形网格上定义;即,具有均匀或不均匀间距的矩形网格。支持线性、最近邻、样条插值。在设置插值器对象后,可以在每次评估时选择插值方法。
- 参数:
- 点浮点数 ndarray 的元组,形状分别为 (m1, ), …, (mn, )
定义 n 维规则网格的点。每个维度中的点(即 points 元组的每个元素)必须严格递增或递减。
- 值array_like, 形状 (m1, …, mn, …)
n维规则网格上的数据。接受复杂数据。
自 1.13.0 版本弃用: 使用
method="pchip"
处理复杂数据已被弃用,并在 SciPy 1.15.0 中将引发错误。这是因为PchipInterpolator
仅适用于实数值。如果您尝试使用传递数组的实部,请对values
使用np.real
。- 方法str, 可选
要执行的插值方法。支持的方法有“linear”、“nearest”、“slinear”、“cubic”、“quintic”和“pchip”。此参数将成为对象的
__call__
方法的默认值。默认值为“linear”。- bounds_errorbool, 可选
如果为 True,当请求的插值值超出输入数据的范围时,会引发 ValueError。如果为 False,则使用 fill_value。默认为 True。
- fill_value浮点数或无,可选
用于插值域外点的值。如果为 None,域外的值将被外推。默认值是
np.nan
。- 求解器可调用,可选
仅用于方法“slinear”、“cubic”和“quintic”。用于构建NdBSpline实例的稀疏线性代数求解器。默认是迭代求解器
scipy.sparse.linalg.gcrotmk
。Added in version 1.13.
- solver_args: dict, 可选
传递给 solver 的额外参数(如果有)。
Added in version 1.13.
- 属性:
- 网格ndarrays 的元组
定义n维规则网格的点。这个元组通过
np.meshgrid(*grid, indexing='ij')
定义了完整的网格。- 值ndarray
网格上的数据值。
- 方法str
插值方法。
- fill_value : float 或
None
浮点数或 将此值用于 __call__ 的越界参数。
- bounds_error布尔
如果
True
,越界参数会引发ValueError
。
方法
__call__
(xi[, method, nu])在坐标处进行插值。
参见
NearestNDInterpolator
N 维空间中 非结构化 数据的最近邻插值器
LinearNDInterpolator
在 N 维空间中对 非结构化 数据的分段线性插值器
interpn
一个封装了
RegularGridInterpolator
的便利函数scipy.ndimage.map_coordinates
在等间距网格上的插值(适用于例如 N-D 图像重采样)
注释
与
LinearNDInterpolator
和NearestNDInterpolator
不同,此类通过利用规则网格结构来避免对输入数据进行昂贵的三角剖分。换句话说,这个类假设数据定义在一个 规则 网格上。
Added in version 0.14.
The ‘slinear’(k=1), ‘cubic’(k=3), 和 ‘quintic’(k=5) 方法是张量积样条插值器,其中 k 是样条的次数。如果任何维度上的点数少于 k + 1,则会引发错误。
Added in version 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]Python 包 regulargrid 由 Johannes Buchner 开发,参见 https://pypi.python.org/pypi/regulargrid/
[2]Wikipedia, “三线性插值”, https://en.wikipedia.org/wiki/Trilinear_interpolation
[3]Weiser, Alan, 和 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
示例
在三维网格的点上评估一个函数
作为一个第一个例子,我们在一个3-D网格的点上评估一个简单的示例函数:
>>> 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
现在是一个 3-D 数组,其中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)
插值和外推二维数据集
作为第二个例子,我们对一个二维数据集进行插值和外推:
>>> 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()
其他示例在 教程 中给出。