當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。