In numpy würde ich gerne die Punkte erkennen, bei denen das Signal von einer bestimmten Schwelle (früher) unterschritten wird und über einer bestimmten anderen Schwelle liegt. Dies ist für Dinge wie Entprellung oder genaue Nulldurchgänge in Gegenwart von Lärm usw.Wie finden Sie Nulldurchgänge mit Hysterese?
So:
import numpy
# set up little test problem
N = 1000
values = numpy.sin(numpy.linspace(0, 20, N))
values += 0.4 * numpy.random.random(N) - 0.2
v_high = 0.3
v_low = -0.3
# find transitions from below v_low to above v_high
transitions = numpy.zeros_like(values, dtype=numpy.bool)
state = "high"
for i in range(N):
if values[i] > v_high:
# previous state was low, this is a low-to-high transition
if state == "low":
transitions[i] = True
state = "high"
if values[i] < v_low:
state = "low"
ich einen Weg mag dies ausdrücklich über das Array ohne Schleifen zu tun: aber ich Ich kann mir keinen Weg vorstellen, da jeder Zustandswert vom vorherigen Zustand abhängt. Ist es möglich, auf eine Schleife zu verzichten?
def hyst(x, th_lo, th_hi, initial = False):
hi = x >= th_hi
lo_or_hi = (x <= th_lo) | hi
ind = np.nonzero(lo_or_hi)[0]
if not ind.size: # prevent index error if ind is empty
return np.zeros_like(x, dtype=bool) | initial
cnt = np.cumsum(lo_or_hi) # from 0 to len(x)
return np.where(cnt, hi[ind[cnt-1]], initial)
Erläuterung::
können Sie, dass 'hyst' Funktion C konvertieren? Vielen Dank. – SpaceDog
@SpaceDog Sie könnten, aber wenn Sie C verwenden, ist es wahrscheinlich besser, eine einfache Schleife ähnlich wie in der ursprünglichen Frage zu schreiben. Der Trick in meiner Antwort ist in Python schneller, da er vektorisierten numpy-Code statt einer langsamen Python-Schleife verwendet. Der vektorisierte Code muss mehrmals über die Daten gehen, während eine einfache Schleife in C alles in einem Durchgang erledigen könnte. –
Ich fragte das, weil ich versuche zu verstehen, was Ihre Funktion tut, also kann ich einen Code in C schreiben ... – SpaceDog