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

1-D 餘緯度座標陣列,嚴格遞增排序。座標必須以弧度表示,且位於開區間 (0, pi) 內。

varray_like

1-D 經度座標陣列,嚴格遞增排序。座標必須以弧度表示。第一個元素(v[0])必須位於區間 [-pi, pi) 內。最後一個元素(v[-1])必須滿足 v[-1] <= v[0] + 2*pi

rarray_like

形狀為 (u.size, v.size) 的 2-D 數據陣列。

sfloat,選用

為估計條件定義的正平滑因子(s=0 用於內插)。

pole_continuitybool 或 (bool, bool),選用

極點 u=0pole_continuity[0])和 u=pipole_continuity[1])處的連續性階數。當此值為 True 或 False 時,極點處的連續性階數將分別為 1 或 0。預設為 False。

pole_valuesfloat 或 (float, float),選用

極點 u=0u=pi 處的數據值。整個參數或每個個別元素都可以是 None。預設為 None。

pole_exactbool 或 (bool, bool),選用

極點 u=0u=pi 處的數據值精確性。如果為 True,則該值被視為正確的函數值,並將完全擬合。如果為 False,則該值將被視為與其他數據值一樣的數據值。預設為 False。

pole_flatbool 或 (bool, bool),選用

對於 u=0u=pi 處的極點,指定近似值是否具有消失的導數。預設為 False。

另請參閱

BivariateSpline

雙變數樣條的基底類別。

UnivariateSpline

用於擬合給定數據點集的平滑單變數樣條。

SmoothBivariateSpline

通過給定點的平滑雙變數樣條

LSQBivariateSpline

使用加權最小平方擬合的雙變數樣條

SmoothSphereBivariateSpline

球座標中的平滑雙變數樣條

LSQSphereBivariateSpline

使用加權最小平方擬合的球座標中的雙變數樣條

RectBivariateSpline

矩形網格上的雙變數樣條。

bisplrep

用於尋找曲面的雙變數 B 樣條表示的函數

bisplev

用於評估雙變數 B 樣條及其導數的函數

Notes

目前,僅支援平滑樣條近似(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

我們想要將其內插到全域一度網格

>>> 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 物件僅接受 1-D 陣列作為輸入,因此我們需要進行一些形狀重塑。

>>> 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()
../../_images/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()
../../_images/scipy-interpolate-RectSphereBivariateSpline-1_01_00.png

方法

__call__(theta, phi[, dtheta, dphi, grid])

在給定位置評估樣條或其導數。

ev(theta, phi[, 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,axis=0)

partial_derivative(dx, dy)

建構一個新的樣條,表示此樣條的偏導數。