获取与numpy中另一个数组的元素相对应的数组元素
Get element of an array that corresponds to the element of another array in numpy
假设我在 numpy 中有两个数组,t
和 v
,并假设 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
来确保索引
在 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])
假设我在 numpy 中有两个数组,t
和 v
,并假设 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
来确保索引
在 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])