splprep#
- scipy.interpolate.splprep(x, w=None, u=None, ub=None, ue=None, k=3, task=0, s=None, t=None, full_output=0, nest=None, per=0, quiet=1)[原始碼]#
尋找 N 維曲線的 B 樣條表示法。
舊版
此函數被視為舊版,將不再接收更新。雖然我們目前沒有移除它的計畫,但我們建議新程式碼改用更現代的替代方案。特別是,我們建議在新程式碼中使用
make_splprep
。給定 N 個 rank-1 陣列的列表 x,代表 N 維空間中由 u 參數化的曲線,找到平滑的近似樣條曲線 g(u)。使用來自 FITPACK 的 FORTRAN 常式 parcur。
- 參數:
- xarray_like
代表曲線的樣本向量陣列列表。
- warray_like, optional
嚴格正的 rank-1 權重陣列,長度與 x[0] 相同。權重用於計算加權最小平方樣條擬合。如果 x 值中的誤差具有由向量 d 給定的標準差,則 w 應為 1/d。預設值為
ones(len(x[0]))
。- uarray_like, optional
參數值陣列。如果未給定,這些值會自動計算為
M = len(x[0])
,其中v[0] = 0
v[i] = v[i-1] + distance(x[i], x[i-1])
u[i] = v[i] / v[M-1]
- ub, ueint, optional
參數區間的端點。預設為 u[0] 和 u[-1]。
- kint, optional
樣條的次數。建議使用三次樣條。應避免使用偶數的 k,尤其是在 s 值較小的情況下。
1 <= k <= 5
,預設值為 3。- taskint, optional
如果 task==0(預設值),則尋找給定平滑因子 s 的 t 和 c。如果 task==1,則尋找另一個平滑因子 s 值的 t 和 c。對於相同的資料集,必須先呼叫 task=0 或 task=1。如果 task==-1,則尋找給定節點集 t 的加權最小平方樣條。
- sfloat, optional
平滑條件。平滑量取決於滿足以下條件:
sum((w * (y - g))**2,axis=0) <= s
,其中 g(x) 是 (x,y) 的平滑內插。使用者可以使用 s 來控制擬合的緊密度和平滑度之間的權衡。較大的 s 表示更多的平滑,而較小的 s 值表示較少的平滑。s 的建議值取決於權重 w。如果權重代表 y 的標準差倒數,則良好的 s 值應在(m-sqrt(2*m),m+sqrt(2*m))
範圍內找到,其中 m 是 x、y 和 w 中的資料點數。- tarray, optional
用於
task=-1
的節點。必須至少有2*k+2
個節點。- full_outputint, optional
如果非零,則傳回選用輸出。
- nestint, optional
樣條節點總數的過高估計值,以幫助確定儲存空間。預設情況下,nest=m/2。總是足夠大的 nest=m+k+1。
- perint, optional
如果非零,則資料點被視為週期性的,週期為
x[m-1] - x[0]
,並傳回平滑週期性樣條近似值。不使用y[m-1]
和w[m-1]
的值。- quietint, optional
非零值可抑制訊息。
- 傳回值:
- tcktuple
一個元組
(t,c,k)
,包含節點向量、B 樣條係數和樣條次數。- uarray
參數值的陣列。
- fpfloat
樣條近似值的加權平方殘差和。
- ierint
關於 splrep 成功的整數旗標。如果 ier<=0,則表示成功。如果 ier 在 [1,2,3] 中,則發生錯誤但未引發。否則會引發錯誤。
- msgstr
與整數旗標 ier 對應的訊息。
另請參閱
註解
有關樣條及其導數的評估,請參閱
splev
。維度 N 的數量必須小於 11。c 陣列中的係數數量比節點數量
len(t)
少k+1
個。這與splrep
相反,後者會將係數陣列填零以使其長度與節點陣列相同。這些額外的係數會被評估常式splev
和BSpline
忽略。參考文獻
[1]P. Dierckx, “Algorithms for smoothing data with periodic and parametric splines, Computer Graphics and Image Processing”, 20 (1982) 171-184.
[2]P. Dierckx, “Algorithms for smoothing data with periodic and parametric splines”, report tw55, Dept. Computer Science, K.U.Leuven, 1981.
[3]P. Dierckx, “Curve and surface fitting with splines”, Monographs on Numerical Analysis, Oxford University Press, 1993.
範例
在極座標中產生蚶線曲線的離散化
>>> import numpy as np >>> phi = np.linspace(0, 2.*np.pi, 40) >>> r = 0.5 + np.cos(phi) # polar coords >>> x, y = r * np.cos(phi), r * np.sin(phi) # convert to cartesian
並進行內插
>>> from scipy.interpolate import splprep, splev >>> tck, u = splprep([x, y], s=0) >>> new_points = splev(u, tck)
請注意,(i) 我們透過使用
s=0
來強制內插,(ii) 參數化u
是自動產生的。現在繪製結果>>> import matplotlib.pyplot as plt >>> fig, ax = plt.subplots() >>> ax.plot(x, y, 'ro') >>> ax.plot(new_points[0], new_points[1], 'r-') >>> plt.show()