Encuentre la longitud de secuencias de valores idénticos en una matriz numpy (codificación de longitud de ejecución)

En un programa pylab (que probablemente también podría ser un programa matlab) tengo una gran cantidad de números que representan distancias:d[t] es eldistancia en el momentot (y el tiempo de mis datos eslen(d) unidades de tiempo).

Los eventos que me interesan son cuando la distancia está por debajo de un cierto umbral, y quiero calcular la duración de estos eventos. Es fácil conseguir una serie de booleanos conb = d<threshold, y el problema se reduce a calcular la secuencia de las longitudes de las palabras de solo verdadero enb. Pero no sé cómo hacerlo de manera eficiente (es decir, utilizando primitivos numpy), y recurrí a recorrer la matriz y hacer la detección de cambio manual (es decir, inicializar el contador cuando el valor va de Falso a Verdadero, aumentar el contador siempre que el valor sea Verdadero , y enviar el contador a la secuencia cuando el valor vuelva a Falso). Pero esto es tremendamente lento.

¿Cómo detectar eficientemente ese tipo de secuencias en matrices numpy?

A continuación se muestra un código de Python que ilustra mi problema: el cuarto punto tarda mucho tiempo en aparecer (si no, aumentar el tamaño de la matriz)

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

Respuestas a la pregunta(5)

Su respuesta a la pregunta