2015-04-24 2 views
5

C'è un buon modo per trovare tratti di Trues in un array booleano numeroso? Se ho un array come:Trova tratti di Trues in serie numpy

x = numpy.array([True,True,False,True,True,False,False]) 

Posso ottenere un array di indici come:

starts = [0,3] 
ends = [1,4] 

o qualsiasi altro modo appropriato per memorizzare queste informazioni. So che questo può essere fatto con alcuni complicati cicli while, ma sto cercando un modo migliore.

+0

questo può essere di interesse per voi https://stackoverflow.com/questions/6352425/whats -la-più-pitonica-strada-per-identificare-duplicati consecutivi-in-a-lista – CoryKramer

+0

cosa sono 'ends = [1,4]'? –

+1

@PadraicCunningham sembra che le sue estremità di 'True's – Kasramvd

risposta

7

È possibile eseguire il pad x con Falses (uno all'inizio e uno alla fine) e utilizzare np.diff. Un "diff" di 1 significa transizione da False a Vero, e di -1 significa transizione da Vero a Falso.

La convenzione deve rappresentare la fine dell'intervallo come l'indice dopo l' l'ultimo. Questo esempio è conforme alla convenzione (si può usare facilmente ends-1 invece di ends per ottenere la matrice nella sua domanda):

x1 = np.hstack([ [False], x, [False] ]) # padding 
d = np.diff(x1.astype(int)) 
starts = np.where(d == 1)[0] 
ends = np.where(d == -1)[0] 
starts, ends 
=> (array([0, 3]), array([2, 5]))