2015-04-24 5 views
5

Gibt es eine gute Möglichkeit, Abschnitte von Trues in einem booleschen Array zu finden? Wenn ich ein Array haben wie:finden Sie Abschnitte von Trues in einem Array

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

Kann ich eine Reihe von Indizes wie:

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

oder andere geeignete Weg, um diese Informationen zu speichern. Ich weiß, dass dies mit einigen komplizierten While-Loops möglich ist, aber ich suche nach einem besseren Weg.

+0

Diese für Sie von Interesse sein kann https://stackoverflow.com/questions/6352425/whats -die-meisten-Python-Weg-zu-identifizieren-konsekutiv-Duplikate-in-einer-Liste – CoryKramer

+0

Was sind 'Enden = [1,4]'? –

+1

@PadraicCunningham scheint, dass seine Enden von 'True's – Kasramvd

Antwort

7

Sie können x mit Falses (eins am Anfang und eins am Ende) padeln, und np.diff verwenden. Ein "diff" von 1 bedeutet einen Übergang von False nach True und von -1 bedeutet einen Übergang von True zu False.

Die Konvention soll das Ende des Bereichs als Index eins nach das letzte darstellen. Dieses Beispiel entspricht der Konvention (Sie leicht ends-1 statt ends verwenden können, um das Array in Frage zu kommen):

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])) 
Verwandte Themen