Länge von Sequenzen mit identischen Werten in einem Numpy-Array finden (Lauflängencodierung)

In einem Pylab-Programm (das wahrscheinlich auch ein Matlab-Programm sein könnte) habe ich eine Reihe von Zahlen, die Entfernungen darstellen:d[t] ist derEntfernung zum Zeitpunktt (und die Zeitspanne meiner Daten istlen(d) Zeiteinheiten).

Die Ereignisse, an denen ich interessiert bin, sind, wenn die Entfernung unter einem bestimmten Schwellenwert liegt, und ich möchte die Dauer dieser Ereignisse berechnen. Es ist einfach, mit einer Reihe von Booleschen Werten zu arbeitenb = d<threshold, und das Problem besteht darin, die Sequenz der Längen der Nur-Wahr-Wörter in zu berechnenb. Aber ich weiß nicht, wie man das effizient macht (dh mit numpy-Primitiven), und ich habe mich entschlossen, das Array zu durchlaufen und die manuelle Änderungserkennung durchzuführen (dh den Zähler zu initialisieren, wenn der Wert von Falsch auf Wahr wechselt, den Zähler zu erhöhen, solange der Wert Wahr ist , und den Zähler an die Sequenz ausgeben, wenn der Wert auf Falsch zurückgeht). Aber das ist enorm langsam.

Wie kann man solche Sequenzen in Numpy Arrays effizient erkennen?

Im Folgenden finden Sie einen Python-Code, der mein Problem veranschaulicht: Es dauert sehr lange, bis der vierte Punkt angezeigt wird (erhöhen Sie andernfalls die Größe des Arrays).

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

Antworten auf die Frage(5)

Ihre Antwort auf die Frage