Als effizientere Methode für große Datenmengen können Sie in Python 3.X accumulate
und groupby
Funktion von itertools
Modul verwenden.
>>> from itertools import accumulate, groupby
>>> [0] + list(accumulate(sum(1 for _ in g) for _,g in groupby(bool_array)))
[0, 5, 10, 13, 15, 19, 26]
die Logik hinter dem Code:
Dieser Code, stuft die sequentiellen doppelten Elemente unter Verwendung groupby()
Funktion, schleift dann über den Iterator durch groupby()
zurückgegeben, die Paare von Tasten enthält (die wir entkommen es unter der Zeile statt einer wegwerfbaren Variable verwendet) und diese kategorisierten Iteratoren.
>>> [list(g) for _, g in groupby(bool_array)]
[[True, True, True, True, True], [False, False, False, False, False], [True, True, True], [False, False], [True, True, True, True], [False, False, False, False, False, False, False]]
Also alles, was wir brauchen, ist die Länge dieser Iteratoren Berechnung und jede Länge mit seiner früheren Länge summieren, um den Index des ersten Elements zu erhalten, das genau ist, wo das Element geändert wird, das ist genau das, was das accumulate()
Funktion ist für.
In Numpy können Sie die folgende Methode verwenden:
In [19]: np.where(arr[1:] - arr[:-1])[0] + 1
Out[19]: array([ 5, 10, 13, 15, 19])
# With leading and trailing indices
In [22]: np.concatenate(([0], np.where(arr[1:] - arr[:-1])[0] + 1, [arr.size]))
Out[22]: array([ 0, 5, 10, 13, 15, 19, 26])
Ich würde sagen, dass die Absicht dieses Codes ziemlich undurchsichtig ist, sogar für ziemlich qualifizierte Leute, leider. 'itertools' ist großartig, aber es ist fast eine Sprache für sich. – PythonNut