获取与numpy中另一个数组的元素对应的数组元素

时间:2015-01-18 15:03:45

标签: python arrays numpy

假设我有numpy中的两个数组tv,并假设t严格单调递增。在我的示例中,t表示一组时间点,v表示身体的相应速度。现在我想要例如在时间t = 3获得速度。我怎么能这样做?

2 个答案:

答案 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来确保索引 在0len(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])