найти длину последовательностей с одинаковыми значениями в массиве numpy (кодирование длин серий)
В программе Pylab (которая, возможно, также может быть программой Matlab) у меня есть массив цифр, представляющих расстояния:d[t]
этоdistance вовремяt
(и временной интервал моих данныхlen(d)
единицы времени).
Интересующие меня события - это когда расстояние ниже определенного порога, и я хочу вычислить продолжительность этих событий. Легко получить массив логических значений сb = d<threshold
и проблема сводится к вычислению последовательности длин истинных слов вb
, Но я не знаю, как это сделать эффективно (например, с помощью numpy примитивов), и я прибегнул к обходу массива и обнаружению изменений вручную (т. Е. Инициализировал счетчик, когда значение переходит из False в True, увеличивая счетчик, пока значение равно True и выведите счетчик в последовательность, когда значение вернется к False). Но это очень медленно.
How to efficienly detect that sort of sequences in numpy arrays ?
Ниже приведен код 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 '.'