Cuente las ocurrencias consecutivas de valores que varían en longitud en una matriz numpy

Digamos que tengo un montón de números en una matriz numpy y los pruebo en base a una condición que devuelve una matriz booleana:

np.random.seed(3456) a = np.random.rand(8) condition = a>0.5 

Y con esta matriz booleana, quiero contar todas las longitudes de ocurrencias consecutivas de True. Por ejemplo, si tuviera [True,True,True,False,False,True,True,False,True] me gustaría volver [3,2,1] .

Puedo hacer eso usando este código:

 length,count = [],0 for i in range(len(condition)): if condition[i]==True: count += 1 elif condition[i]==False and count>0: length.append(count) count = 0 if i==len(condition)-1 and count>0: length.append(count) print length 

Pero, ¿hay algo ya implementado para esto o una función de python, numpy, scipy, etc. que cuenta la longitud de sucesos consecutivos en una lista o matriz para una entrada determinada?

Aquí hay una solución que usa itertools (probablemente no sea la solución más rápida):

 import itertools condition = [True,True,True,False,False,True,True,False,True] [ sum( 1 for _ in group ) for key, group in itertools.groupby( condition ) if key ] Out: [3, 2, 1] 

Si ya tienes una matriz numpy, esto probablemente será más rápido:

 >>> condition = np.array([True,True,True,False,False,True,True,False,True]) >>> np.diff(np.where(np.concatenate(([condition[0]], condition[:-1] != condition[1:], [True])))[0])[::2] array([3, 2, 1]) 

Detecta dónde comienzan los trozos, tiene cierta lógica para el primer y último trozo, y simplemente calcula las diferencias entre los arranques de trozos y descarta las longitudes correspondientes a los trozos False .