В программе pylab (которая, возможно, также была бы также программой Matlab), у меня есть числовой массив чисел, представляющих расстояния: d[t]
- это расстояние в момент времени t
(а период времени моих данных - len(d)
временные единицы).
События, которые меня интересуют, - это расстояние ниже определенного порога, и я хочу рассчитать продолжительность этих событий. Легко получить массив логических значений с помощью b = d<threshold
, и проблема сводится к вычислению последовательности длин слов True только в b
. Но я не знаю, как это сделать эффективно (т.е. Используя numpy-примитивы), и я прибег к работе с массивом и для ручного обнаружения изменений (т.е. инициализирует счетчик, когда значение переходит от False к True, увеличивает счетчик, пока значение равно True, и выведите счетчик в последовательность, когда значение вернется к False). Но это очень медленно.
Как эффективно обнаруживать такие последовательности в массивах numpy?
Ниже приведен код python, который иллюстрирует мою проблему: четвертая точка занимает очень много времени (если нет, увеличивайте размер массива)
from pylab import *
threshold = 7
print '.'
d = 10*rand(10000000)
print '.'
b = d<threshold
print '.'
durations=[]
for i in xrange(len(b)):
if b[i] and (i==0 or not b[i-1]):
counter=1
if i>0 and b[i-1] and b[i]:
counter+=1
if (b[i-1] and not b[i]) or i==len(b)-1:
durations.append(counter)
print '.'