簡體   English   中英

這是scipy.interpolate.interp1d中的錯誤嗎?

[英]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) == 0xi(1.0+1e-13) == 1

interp1d中的插值間隔定義為closed, [0, 2] 原則上可以預期存在單個浮點值x=2.0 ,其給出結果2.0

但是,如上面的注釋中所述,這里的樣條實現來自FITPACK,它將k = 0樣條定義為從右邊開始的連續,除了最后一個不同的間隔。 我不知道原因--- Fortran代碼可以追溯到80年代。 我的猜測是它的工作方式沒有特定的原因,可能除了使用B樣條表示編寫這樣的代碼稍微方便一點之外。

在我看來,這種行為是一個錯誤/怪癖 ,但由於x值中存在任何舍入錯誤使其影響為零,因此優先解決問題。 (需要考慮的一個方面是,由於沒有規定它的作用,它是由實現定義的;打破后向compat可能比問題本身更糟糕。)

編輯 :如另一個答案中所述,樣條實際上是由splmake構造的; 這個例程不是來自FITPACK。 不能說沒有看最終的間隔行為是由於擬合還是構造。

根據 ,間隔在[0,2]之間,包括2.創建樣條的返回是cvals splmake(xx, xx, 0)[1] --> array([0.0, 1.0]) 在源代碼之后,我們將調用以在一個點處評估樣條曲線,該點導致spleval(splmake(xx, xx, 0), 2) --> array(1.0) 要回答你的問題,實際上沒有一個答案就是這樣實現的,如果你認為原始數組是否包含有效范圍我認為它是有道理的 - 但也許應該有一個關於這個特定評估的說明,其中如果你總是可以提交申請在這里 我不能評論否則我會,但希望它回答你的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM