假设我有numpy中的两个数组t
和v
,并假设t
严格单调递增。在我的示例中,t
表示一组时间点,v
表示身体的相应速度。现在我想要例如在时间t = 3
获得速度。我怎么能这样做?
答案 0 :(得分:3)
如果你有scipy,那么有一个功能就是这样:
from scipy.interpolate import interp1d
velocity = interp1d(t, v, kind="cubic")
print(velocity(3.0))
请参阅http://docs.scipy.org/doc/scipy-0.14.0/reference/tutorial/interpolate.html
上的文档答案 1 :(得分:3)
对于仅使用NumPy的线性插值,您可以使用np.interp
。
例如,
import numpy as np
t = np.linspace(0, 5, 100)
v = np.sin(t)
在v
:
t=3
的线性插值
In [266]: np.interp(3, t, v)
Out[266]: 0.14107783526460238
请注意,如果您希望在v
的多个值中插入t
,则可以将iterable作为第一个参数传递给np.interp
:
In [292]: np.interp(np.linspace(t.min(), t.max(), 10), t, v)
Out[292]:
array([ 0. , 0.52741539, 0.8961922 , 0.99540796, 0.79522006,
0.35584199, -0.19056796, -0.67965796, -0.96431712, -0.95892427])
这比一次为一个值重复调用np.interp
要高效得多。
要获取数组的元素,v
,对应t=3
,您可以使用np.searchsorted
:
In [272]: v[np.searchsorted(t, 3)]
Out[272]: 0.11106003812412972
但请注意,np.searchsorted
会返回将3
插入t
的索引,以维持其排序。因此v[np.searchsorted(t, 3)]
和v[np.searchsorted(t, 3)+1]
将速度夹在t=3
。
还要注意np.searchsorted
可能会返回比t
(和v
)的最大有效索引大1的索引。如果3 > t.max()
:
例如,如果t
为[1,2,3]
:
In [277]: np.searchsorted([1,2,3], 5)
Out[277]: 3
因此,为了防止可能的IndexError,请使用np.clip
来确保索引
在0
和len(v)-1
之间:
idx = np.clip(np.searchsorted(t, 3), 0, len(v)-1)
v[idx]
与np.interp
类似,np.searchsorted
可以接受可迭代(此处为第二个参数):
In [306]: v[np.clip(np.searchsorted(t, [3,4,5,6]), 0, len(v)-1)]
Out[306]: array([ 0.11106004, -0.7825875 , -0.95892427, -0.95892427])