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)[源代码]¶
球面上矩形网格上的二元样条逼近。
可用于平滑数据。
0.11.0 新版功能.
- 参数
- uarray_like
严格升序的一维纬度坐标数组。坐标必须以弧度表示,并且位于开放区间内
(0, pi)
。- varray_like
严格升序的一维经度坐标数组。坐标必须以弧度表示。第一个元素 (
v[0]
)必须在间隔内[-pi, pi)
。最后一个元素 (v[-1]
)必须满足v[-1] <= v[0] + 2*pi
。- rarray_like
具有形状的二维数据数组
(u.size, v.size)
。- s浮动,可选
为估计条件定义的正平滑因子 (
s=0
用于插值)。- pole_continuitybool or(bool,bool),可选
Order of continuity at the poles
u=0
(pole_continuity[0]
) andu=pi
(pole_continuity[1]
). The order of continuity at the pole will be 1 or 0 when this is True or False, respectively. Defaults to False.- pole_valuesFLOAT OR(FLOAT,FLOAT),可选
两极的数据值
u=0
和u=pi
。整个参数或每个单独的元素都可以为None。默认为无。- pole_exactbool or(bool,bool),可选
极点数据值的准确性
u=0
和u=pi
。如果为True,则该值被视为正确的函数值,并且将精确拟合。如果为False,则该值将被视为数据值,就像其他数据值一样。默认为False。- pole_flatbool or(bool,bool),可选
对于两极来说,
u=0
和u=pi
中,指定近似是否具有逐渐消失的导数。默认为False。
参见
BivariateSpline
二元样条的基类。
UnivariateSpline
一种光滑的单变量样条,用于拟合给定的数据点集合。
SmoothBivariateSpline
一种通过给定点的光顺二元样条
LSQBivariateSpline
基于加权最小二乘拟合的二元样条
SmoothSphereBivariateSpline
球坐标下的光顺二元样条
LSQSphereBivariateSpline
球坐标下加权最小二乘拟合的二元样条
RectBivariateSpline
矩形网格上的二元样条。
bisplrep
求曲面的二元B样条表示的函数
bisplev
二元B样条及其导数的一个求值函数
注意事项
目前,只有平滑样条近似 (
iopt[0] = 0
和iopt[0] = 1
在FITPACK例程中)是受支持的。精确的最小二乘样条逼近尚未实现。在实际执行插值时,请求的 v 值必须位于与原始的2pi间隔相同的长度范围内 v 值选自。
有关更多信息,请参阅 FITPACK 关于此功能的站点。
示例
假设我们在粗略网格上有全局数据
>>> 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
我们想要将其插值到全球一度网格中
>>> 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()
选择最优值
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
must be determined by trial and error. The best is then to start with a very large value ofs
(to determine the least-squares polynomial and the corresponding upper boundfp0
fors
) and then to progressively decrease the value ofs
(say by a factor 10 in the beginning, i.e.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()
方法:
__call__
\(θ,φ[, dtheta, dphi, grid] )计算给定位置的样条曲线或其导数。
ev
\(θ,φ[, dtheta, dphi] )对点处的样条曲线求值
get_coeffs
\()返回样条系数。
get_knots
\()返回一个元组(tx,ty),其中tx,ty分别包含样条曲线相对于x,y变量的节点位置。
get_residual
\()返回样条近似的平方残差的加权和:SUM((w [i] [(z[i]-s(x[i],y[i])))] *2,轴=0)