2015-01-18 4 views
2

Предположим, у меня есть два массива в numpy, t и v и предположим, что t строго монотонно возрастает. В моем примере t представляет собой массив точек времени и v соответствующую скорость тела. Теперь я хочу, например, получить скорость в момент времени t = 3. Как я могу это сделать?Получить элемент массива, который соответствует элементу другого массива в numpy

ответ

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, вы можете передать итератор как первый аргумент до 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]) 

Этот i гораздо эффективнее вызова 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 может возвращать индекс, который на 1 больше, чем самый большой действующий индекс для tv). Это происходит, если 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]) 
Смежные вопросы