[英]Is this an error in scipy.interpolate.interp1d?
使用零階插值時,我發現輸入數組中的最后一個Y值不會返回X數組中的最后一個值:
from scipy.interpolate import interp1d
xx = [0.0, 1.0, 2.0]
xi = interp1d(xx, xx, kind='zero')
print(xi(xx))
似乎它應該返回[0.,1.,2。],但它返回[0.,1.,1。]。 xx中的最后一個值被認為是在插值范圍內,但不會作為最后一個點的值返回。 文檔沒有提供“零”的詳細信息,但我希望它會:
a)引發ValueError,因為輸入值被認為是在半閉合范圍[0,1。]和[1.,2。]上定義值,從而使2.0未定義,或者
b)返回2.0因為范圍是[0,1。),[1.,2。]和[2.,2。)
interp1d函數似乎認為正確的答案是:
c)返回1.0,因為最后一個范圍是特殊情況,定義為閉區間[1.,2。]
有正確的選擇嗎? 如果是這樣,它是由interp1d實現的嗎?
零階樣條是分段常數,並且在結處具有不連續性,這里是插值點,因此xi(1.0-1e-13) == 0
和xi(1.0+1e-13) == 1
。
interp1d中的插值間隔定義為closed, [0, 2]
。 原則上可以預期存在單個浮點值x=2.0
,其給出結果2.0
但是,如上面的注釋中所述,這里的樣條實現來自FITPACK,它將k = 0樣條定義為從右邊開始的連續,除了最后一個不同的間隔。 我不知道原因--- Fortran代碼可以追溯到80年代。 我的猜測是它的工作方式沒有特定的原因,可能除了使用B樣條表示編寫這樣的代碼稍微方便一點之外。
在我看來,這種行為是一個錯誤/怪癖 ,但由於x值中存在任何舍入錯誤使其影響為零,因此優先解決問題。 (需要考慮的一個方面是,由於沒有規定它的作用,它是由實現定義的;打破后向compat可能比問題本身更糟糕。)
編輯 :如另一個答案中所述,樣條實際上是由splmake
構造的; 這個例程不是來自FITPACK。 不能說沒有看最終的間隔行為是由於擬合還是構造。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.