我正在寻找一种在两个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])
在我的开始和终点之间有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. ])
但不仅仅是第一次进入,而是整个阵列。
显然,这不会这样做:
np.interp(1, [1,5], [fst,snd])
嗯,我知道我在一个循环中到达那里,例如
[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]
但是我相信当你正在淘汰numpy数组时,你正在做一些根本错误的事情。
答案 0 :(得分:2)
如果您将样本形成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)
然后,您可以在任何感兴趣的时间生成插值向量。例如linfit(2)
生成:
array([ 3.25, 3.25, 1.5 , 3.25, 1. , 4.25, 3.5 , 2.75, 4.75, 2.25])
或者您可以使用时间值向量调用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 ]])
如果您只进行线性插值,您还可以执行以下操作:
((5-t)/(5-1)) * fst + ((t-1)/(5-1)) * snd
在任何时间t直接计算插值向量。