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

Get element of an array that corresponds to the element of another array in numpy

假设我在 numpy 中有两个数组,tv,并假设 t 严格单调递增。在我的示例中,t 表示时间点数组,v 表示物体的相应速度。现在我想要例如在时间 t = 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

中的文档

对于仅使用 NumPy 的线性插值,您可以使用 np.interp。 例如,

import numpy as np
t = np.linspace(0, 5, 100)
v = np.sin(t)

t=3时求v的线性插值:

In [266]: np.interp(3, t, v)
Out[266]: 0.14107783526460238

请注意,如果您希望在 t 的许多值处插入 v,您可以将可迭代对象作为第一个参数传递给 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 return 是索引,其中 3 将被插入到 t 中以保持其排序。所以 v[np.searchsorted(t, 3)]v[np.searchsorted(t, 3)+1] 将速度夹在 t=3 处。

还要注意 np.searchsorted 可能 return 一个比 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])