我有兩個值,并且知道它們在一個充滿 nan 的陣列中的索引。我想內插/外推所有 nan
import numpy as np
y = np.array([np.nan, np.nan, 0.75, np.nan, np.nan, np.nan, np.nan, np.nan, 2.25])
在這個答案的幫助下,我寫了以下內容:
nans, x = np.isnan(y), lambda z: z.nonzero()[0]
y[nans] = np.interp(x(nans), x(~nans), y[~nans])
我的輸出如下所示:
[0.75 0.75 0.75 1. 1.25 1.5 1.75 2. 2.25]
但是,我希望它是:
[0.25 0.5 0.75 1. 1.25 1.5 1.75 2. 2.25]
增量始終是一個常數。當我閱讀檔案時,np.iterp我發現我可以指定輸入引數left和right. 如果我沒有指定, x < xp[0]left回傳的值是fp[0]。
如何指定left并right獲得所需的輸出?
uj5u.com熱心網友回復:
np.interp似乎沒有進行外推,但scipy.interpolate.interp1d確實如此。
給出的引數有點不同,您可以將其作為特定情況的函式:
import numpy as np
from scipy.interpolate import interp1d
def interp_nans(y, x=None):
if x is None:
x = np.arange(len(y))
nans = np.isnan(y)
interpolator = interp1d(
x[~nans],
y[~nans],
kind="linear",
fill_value="extrapolate",
assume_sorted=True,
)
return interpolator(x)
檢查它是否有效:
y = np.array([np.nan, np.nan, 0.75, np.nan, np.nan, np.nan, np.nan, np.nan, 2.25])
expected = np.array([0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25])
result = interp_nans(y)
assert np.array_equal(result, expected)
uj5u.com熱心網友回復:
您無法指定left和right實作外推interp,它們只是常數值。
如果您更喜歡純 numpy 解決方案,則可以根據插值陣列的第一個/最后兩個值進行線性外推:
def extrap(x, xp, fp):
m = (fp[1] - fp[0]) / (xp[1] - xp[0])
n = fp[0] - m * xp[0]
result = m * x[x < xp[0]] n
m = (fp[-1] - fp[-2]) / (xp[-1] - xp[-2])
n = fp[-1] - m * xp[-1]
return np.concatenate([result, m * x[x > xp[-1]] n])
(您可能需要添加對len(xp) > 1and的驗證len(xp) == len(yp))
例子:
y = np.array([np.nan, np.nan, 0.75, np.nan, np.nan, np.nan, np.nan, np.nan, 2.25, np.nan])
nans, x = np.isnan(y), lambda z: z.nonzero()[0]
y[nans] = np.interp(x(nans), x(~nans), y[~nans], np.nan, np.nan)
nans, x = np.isnan(y), lambda z: z.nonzero()[0]
y[nans] = extrap(x(nans), x(~nans), y[~nans])
結果
array([0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. , 2.25])
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/497821.html
