scipy.interpolate.

RegularGridInterpolator#

class scipy.interpolate.RegularGridInterpolator(points, values, method='linear', bounds_error=True, fill_value=nan, *, solver=None, solver_args=None)[source]#

在任意维度的规则或直线网格上的插值器。

数据必须定义在直线网格上;也就是说,一个具有均匀或不均匀间距的矩形网格。支持线性、最近邻、样条插值。设置插值器对象后,可以在每次求值时选择插值方法。

参数:
points浮点数 ndarray 元组,形状为 (m1, ), …, (mn, )

定义 n 维规则网格的点。每个维度中的点(即 points 元组的每个元素)必须严格递增或递减。

valuesarray_like,形状 (m1, …, mn, …)

n 维规则网格上的数据。接受复数数据。

自版本 1.13.0 起已弃用: method="pchip" 已弃用复数数据,将在 SciPy 1.15.0 中引发错误。这是因为 PchipInterpolator 仅适用于实数值。如果您尝试使用传递的数组的实部,请对 values 使用 np.real

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 维图像重采样)

注意事项

LinearNDInterpolatorNearestNDInterpolator 不同,此类通过利用规则网格结构避免了对输入数据的昂贵三角剖分。

换句话说,此类假设数据定义在直线网格上。

在版本 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 和 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()
../../_images/scipy-interpolate-RegularGridInterpolator-1_00_00.png

其他示例在 教程中 给出。

属性:
gridndarrays 元组

定义 n 维规则网格的点。此元组通过 np.meshgrid(*grid, indexing='ij') 定义完整网格

valuesndarray

网格上的数据值。

methodstr

插值方法。

fill_valuefloat 或 None

__call__ 的越界参数使用此值。

bounds_errorbool

如果为 True,则越界参数会引发 ValueError

方法

__call__(xi[, method, nu])

在坐标处插值。