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=0
(pole_continuity[0]
)和u=pi
(pole_continuity[1]
)處的連續性階數。當此值為 True 或 False 時,極點處的連續性階數將分別為 1 或 0。預設為 False。- pole_valuesfloat 或 (float, float),選用
極點
u=0
和u=pi
處的數據值。整個參數或每個個別元素都可以是 None。預設為 None。- pole_exactbool 或 (bool, bool),選用
極點
u=0
和u=pi
處的數據值精確性。如果為 True,則該值被視為正確的函數值,並將完全擬合。如果為 False,則該值將被視為與其他數據值一樣的數據值。預設為 False。- pole_flatbool 或 (bool, bool),選用
對於
u=0
和u=pi
處的極點,指定近似值是否具有消失的導數。預設為 False。
另請參閱
BivariateSpline
雙變數樣條的基底類別。
UnivariateSpline
用於擬合給定數據點集的平滑單變數樣條。
SmoothBivariateSpline
通過給定點的平滑雙變數樣條
LSQBivariateSpline
使用加權最小平方擬合的雙變數樣條
SmoothSphereBivariateSpline
球座標中的平滑雙變數樣條
LSQSphereBivariateSpline
使用加權最小平方擬合的球座標中的雙變數樣條
RectBivariateSpline
矩形網格上的雙變數樣條。
bisplrep
用於尋找曲面的雙變數 B 樣條表示的函數
bisplev
用於評估雙變數 B 樣條及其導數的函數
Notes
目前,僅支援平滑樣條近似(FITPACK 常式中的
iopt[0] = 0
和iopt[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()
選擇
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()
方法
__call__
(theta, phi[, dtheta, dphi, grid])在給定位置評估樣條或其導數。
ev
(theta, phi[, dtheta, dphi])在點評估樣條
傳回樣條係數。
傳回一個元組 (tx,ty),其中 tx,ty 分別包含樣條關於 x-、y-變數的節點位置。
傳回樣條近似的平方殘差的加權總和:sum ((w[i]*(z[i]-s(x[i],y[i])))**2,axis=0)
partial_derivative
(dx, dy)建構一個新的樣條,表示此樣條的偏導數。