numpy:如何在两个数组之间插入不同的时间步长?

Lar*_*gas 6 python interpolation numpy

我正在寻找一种在两个numpy数组之间进行简单线性插值的方法,这些数组表示时间的起点和终点.

这两个数组的长度相同:

fst = np.random.random_integers(5, size=(10.))
>>> array([4, 4, 1, 3, 1, 4, 3, 2, 5, 2])
snd = np.random.random_integers(5, size=(10.))
>>> array([1, 1, 3, 4, 1, 5, 5, 5, 4, 3])
Run Code Online (Sandbox Code Playgroud)

在我的开始和终点之间有3个时间步.如何在fst和之间进行插值snd?我希望能够,采取的第一个条目fst,并snd作为一个例子,以检索每个时间步长像的价值

np.interp(1, [1,5], [4,1])    
np.interp(2, [1,5], [4,1])
...
# that is
np.interp([1,2,3,4,5], [1,5], [4,1])
>>> array([ 4.  ,  3.25,  2.5 ,  1.75,  1.  ])
Run Code Online (Sandbox Code Playgroud)

但不仅仅是第一次进入,而是整个阵列.

显然,这不会这样做:

np.interp(1, [1,5], [fst,snd])
Run Code Online (Sandbox Code Playgroud)

嗯,我知道我会在一个循环中到达那里,例如

[np.interp(2, [1,5], [item,snd[idx]]) for idx,item in enumerate(fst)]
>>> [3.25, 3.25, 1.5, 3.25, 1.0, 4.25, 3.5, 2.75, 4.75, 2.25]
Run Code Online (Sandbox Code Playgroud)

但是我相信当你正在淘汰numpy阵列时,你正在做一些根本错误的事情.

rwp*_*rwp 7

如果您将样本形成 2D 矩阵,scipy.interpolate.interp1d中的工具可以很容易地完成此操作。在您的情况下,您可以构建一个 2xN 数组,并构建一个对列进行运算的插值函数:

from scipy.interpolate import interp1d
fst = np.array([4, 4, 1, 3, 1, 4, 3, 2, 5, 2])
snd = np.array([1, 1, 3, 4, 1, 5, 5, 5, 4, 3])
linfit = interp1d([1,5], np.vstack([fst, snd]), axis=0)
Run Code Online (Sandbox Code Playgroud)

然后,您可以在任何感兴趣的时间生成内插向量。例如linfit(2)产生:

array([ 3.25,  3.25,  1.5 ,  3.25,  1.  ,  4.25,  3.5 ,  2.75,  4.75,  2.25])
Run Code Online (Sandbox Code Playgroud)

或者您可以linfit()使用时间值向量进行调用,例如linfit([1,2,3])

array([[ 4.  ,  4.  ,  1.  ,  3.  ,  1.  ,  4.  ,  3.  ,  2.  ,  5.  ,  2.  ],
       [ 3.25,  3.25,  1.5 ,  3.25,  1.  ,  4.25,  3.5 ,  2.75,  4.75,           2.25],
       [ 2.5 ,  2.5 ,  2.  ,  3.5 ,  1.  ,  4.5 ,  4.  ,  3.5 ,  4.5 , 2.5 ]])
Run Code Online (Sandbox Code Playgroud)

如果您只进行线性插值,您还可以执行以下操作:

((5-t)/(5-1)) * fst + ((t-1)/(5-1)) * snd
Run Code Online (Sandbox Code Playgroud)

在任何时间 t 直接计算插值向量。