当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy interpolate.RegularGridInterpolator用法及代码示例


本文简要介绍 python 语言中 scipy.interpolate.RegularGridInterpolator 的用法。

用法:

class  scipy.interpolate.RegularGridInterpolator(points, values, method='linear', bounds_error=True, fill_value=nan)#

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

数据必须在直线网格上定义;即间距均匀或不均匀的矩形网格。支持线性、nearest-neighbor、样条插值。设置插值器对象后,可以在每次评估时选择插值方法。

参数

points float 的 ndarray 元组,形状为 (m1, ), ..., (mn, )

定义 n 维规则网格的点。每个维度中的点(即点元组的每个元素)必须严格升序或降序。

values 数组, 形状 (m1, ..., mn, ...)

n 维规则网格上的数据。复杂的数据是可以接受的。

method str,可选

要执行的插值方法。支持“linear”, “nearest”, “slinear”, “cubic”, “quintic” 和“pchip”。该参数将成为对象__call__方法的默认参数。默认为“linear”。

bounds_error 布尔型,可选

如果为 True,则当在输入数据域之外请求内插值时,会引发 ValueError。如果为 False,则使用fill_value。默认为 True。

fill_value 浮点数或无,可选

用于插值域之外的点的值。如果没有,则推断域外的值。默认为 np.nan

注意

LinearNDInterpolator NearestNDInterpolator 相反,此类通过利用规则网格结构避免了昂贵的输入数据三角测量。

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

‘slinear’(k=1)、‘cubic’(k=3) 和 ‘quintic’(k=5) 方法是 tensor-product 样条插值器,其中 k 是样条次数,如果任何维度的点数少于k + 1,将会出现错误。

如果输入数据的维度具有不相称的单位并且相差多个数量级,则插值可能会出现数值伪影。考虑在插值之前重新缩放数据。

参考

[1]

Python包规则网格作者:约翰内斯·布赫纳 (Johannes Buchner),参见https://pypi.python.org/pypi/regulargrid/

[2]

维基百科,“Trilinear interpolation”,https://en.wikipedia.org/wiki/Trilinear_interpolation

[3]

韦瑟、艾伦和塞尔吉奥·E·扎兰托内洛。 “关于多维度分段线性和多线性表插值的注释。”数学。计算。 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 现在是带有 data[i, j, k] = f(x[i], y[j], z[k]) 的 3-D 数组。接下来,根据这些数据定义一个插值函数:

>>> 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 数据集进行插值和外推

作为第二个示例,我们对二维数据集进行插值和外推:

>>> 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()
scipy-interpolate-RegularGridInterpolator-1_00_00.png

本教程中给出了其他示例。

属性

grid ndarray 的元组

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

values ndarray

网格上的数据值。

method str

插值法。

fill_value 浮点数或None

将此值用于 __call__ 的越界参数。

bounds_error bool

如果 True ,越界参数引发 ValueError

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.interpolate.RegularGridInterpolator。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。