encontrar comprimento de sequências de valores idênticos em um array numpy (codificação de comprimento de execução)

Em um programa pylab (que provavelmente também poderia ser um programa matlab), eu tenho um numpy array de números representando distâncias:d[t] é odistância no tempot (e o período de tempo dos meus dados élen(d) unidades de tempo).

Os eventos em que estou interessado são quando a distância está abaixo de um certo limite e quero calcular a duração desses eventos. É fácil obter uma variedade de booleanos comb = d<threshold, e o problema se resume em calcular a seqüência dos comprimentos das palavras True-only emb. Mas eu não sei como fazer isso de forma eficiente (ie usando primitivas numpy), e eu recorri a walk the array e a fazer detecção manual de alterações (ie inicializar contador quando o valor vai de False para True, aumentar contador contanto que o valor seja True , e saída do contador para a seqüência quando o valor volta para False). Mas isso é tremendamente lento.

Como detectar eficientemente esse tipo de seqüências em matrizes numpy?

Abaixo está um código python que ilustra o meu problema: o quarto ponto leva muito tempo para aparecer (se não, aumentar o tamanho do array)

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 '.'

questionAnswers(5)

yourAnswerToTheQuestion