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


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


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

用法:

class  scipy.interpolate.RectSphereBivariateSpline(u, v, r, s=0.0, pole_continuity=False, pole_values=None, pole_exact=False, pole_flat=False)#

球体上矩形网格上的二元样条近似。

可用于平滑数据。

参数

u array_like

严格按升序排列的一维纬度坐标数组。坐标必须以弧度表示并且位于开放区间 (0, pi) 内。

v array_like

严格按升序排列的一维经度坐标数组。坐标必须以弧度表示。第一个元素 (v[0]) 必须位于区间 [-pi, pi) 内。最后一个元素 (v[-1]) 必须满足 v[-1] <= v[0] + 2*pi

r array_like

形状为 (u.size, v.size) 的二维数据数组。

s 浮点数,可选

为估计条件定义的正平滑因子(s=0 用于插值)。

pole_continuity bool or (bool, bool), 可选

u=0 (pole_continuity[0]) 和 u=pi (pole_continuity[1]) 两极的连续性顺序。当它为真或假时,极点的连续性顺序将分别为 1 或 0。默认为假。

pole_values 浮点数或(浮点数,浮点数),可选

极点 u=0u=pi 的数据值。整个参数或每个单独的元素都可以是 None。默认为无。

pole_exact bool or (bool, bool), 可选

极点 u=0u=pi 的数据值准确性。如果为 True,则该值被认为是正确的函数值,它将被精确拟合。如果为 False,则该值将被视为与其他数据值一样的数据值。默认为假。

pole_flat bool or (bool, bool), 可选

对于 u=0u=pi 处的极点,指定近似值是否具有消失导数。默认为假。

注意

目前,仅支持平滑样条近似(FITPACK 例程中的iopt[0] = 0iopt[0] = 1)。精确的最小二乘样条近似尚未实现。

在实际执行插值时,请求的 v 值必须位于与选择原始 v 值相同的长度 2pi 间隔内。

有关详细信息,请参阅有关此函数的FITPACK 站点。

例子

假设我们在粗网格上有全局数据

>>> import numpy as np
>>> lats = np.linspace(10, 170, 9) * np.pi / 180.
>>> lons = np.linspace(0, 350, 18) * np.pi / 180.
>>> data = np.dot(np.atleast_2d(90. - np.linspace(-80., 80., 18)).T,
...               np.atleast_2d(180. - np.abs(np.linspace(0., 350., 9)))).T

我们想将其插入到全局one-degree 网格中

>>> new_lats = np.linspace(1, 180, 180) * np.pi / 180
>>> new_lons = np.linspace(1, 360, 360) * np.pi / 180
>>> new_lats, new_lons = np.meshgrid(new_lats, new_lons)

我们需要设置插值器对象

>>> from scipy.interpolate import RectSphereBivariateSpline
>>> lut = RectSphereBivariateSpline(lats, lons, data)

最后我们对数据进行插值。 RectSphereBivariateSpline 对象仅接受一维数组作为输入,因此我们需要进行一些重塑。

>>> data_interp = lut.ev(new_lats.ravel(),
...                      new_lons.ravel()).reshape((360, 180)).T

查看原始数据和插值后的数据,可以看到插值法很好地再现了原始数据:

>>> import matplotlib.pyplot as plt
>>> fig = plt.figure()
>>> ax1 = fig.add_subplot(211)
>>> ax1.imshow(data, interpolation='nearest')
>>> ax2 = fig.add_subplot(212)
>>> ax2.imshow(data_interp, interpolation='nearest')
>>> plt.show()
scipy-interpolate-RectSphereBivariateSpline-1_00_00.png

选择s 的最佳值可能是一项艰巨的任务。 s 的推荐值取决于数据值的准确性。如果用户对数据的统计误差有所了解,她还可以找到 s 的正确估计值。通过假设,如果她指定正确的 s ,则插值器将使用样条 f(u,v) 精确再现数据基础的函数,她可以评估 sum((r(i,j)-s(u(i),v(j)))**2) 以找到对此 s 的良好估计。例如,如果她知道她的 r(i,j) 值上的统计误差不大于 0.1,她可能会期望一个好的 s 的值应该不大于 u.size * v.size * (0.1)**2

如果对r(i,j) 中的统计错误一无所知,则必须通过反复试验来确定s。最好的方法是从 s 的非常大的值开始(以确定最小二乘多项式和 s 的相应上限 fp0 ),然后逐渐减小 s 的值(例如开始时因子 10,即 s = fp0 / 10, fp0 / 100, ...,并且更仔细,因为近似值显示更多细节)以获得更接近的拟合。

s 的不同值的插值结果可以深入了解这个过程:

>>> fig2 = plt.figure()
>>> s = [3e9, 2e9, 1e9, 1e8]
>>> for idx, sval in enumerate(s, 1):
...     lut = RectSphereBivariateSpline(lats, lons, data, s=sval)
...     data_interp = lut.ev(new_lats.ravel(),
...                          new_lons.ravel()).reshape((360, 180)).T
...     ax = fig2.add_subplot(2, 2, idx)
...     ax.imshow(data_interp, interpolation='nearest')
...     ax.set_title(f"s = {sval:g}")
>>> plt.show()
scipy-interpolate-RectSphereBivariateSpline-1_01_00.png

相关用法


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