2017-09-20 2 views
2

I haben zwei große Listen t und y und ich möchte in einem performante Weise zu bestimmen, zu welchen Zeiten und wie lange die Daten in einen vordefinierten ylimit überschreitet, d.h. >=limit.bestimmen, wie lange ein Signal über einer vordefinierten Grenze liegt

Das Problem mit den folgenden Beispieldaten wird dargestellt:

t = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] 
y = [8,6,4,2,0,2,4,6,8,6,4,2,0,2,4,6,8] 
limit = 4 
In diesem Beispiel

enter image description here

, sollte der Code die folgenden Listen zurück:

t_exceedance_start = [0,6,14] 
t_how_long_above_limit = [2,4,2] 

Ich würde erwarten, dass Dies kann sehr elegant in Numpy implementiert werden, aber nicht herausfinden, wie.

Alle Vorschläge werden sehr geschätzt.

+0

Sie sollten bei einer Polygon-Bibliothek wie shapley – kezzos

+0

@Divakar No einen Blick beginnt das zweite Intervall um 6s und an 10s beendet. – Rickson

Antwort

1

Hier ist ein vektorisiert Ansatz Verwendung von booleans für Leistungseffizienz zu machen -

# Get array versions if aren't already 
y = np.asarray(y) 
t = np.asarray(t) 

# Get mask of thresholded y with boundaries of False on either sides. 
# The intention is to use one-off shifted comparison to catch the 
# boundaries of each island of thresholed True values (done in next step). 
# Those appended False values act as triggers to catch the start of 
# first island and end of last island. 
mask = np.concatenate(([False], y>=limit, [False])) 
idx = np.flatnonzero(mask[1:] != mask[:-1]) 

# The starting indices for each island would be the indices at steps of 2. 
# The ending indices would be steps of 2 as well starting from first index. 
# Thus, get the island lengths by simply differencing between start and ends. 
starts = idx[::2] 
ends = idx[1::2] - 1 
lens = ends - starts 

# Get starts, ends, lengths according to t times 
start_times = t[starts] 
end_times = t[ends] 
len_times = end_times - start_times 
+0

Hmmm. start_times wird korrekt berechnet, aber es gibt einige Probleme mit dem Objektiv. Die resultierende Liste besteht im Wesentlichen nur aus Nullen 8 und einigen). Kann es sein, weil der Echtzeitvektor eine sehr feine Auflösung hat (0,0001, 0,00012, 0,00013, ...) und seine Zeitstempel nicht äquidistant sind? – Rickson

+0

@Rickson Was bedeutet '(np.asarray (y)> = limit) .sum()' dir? – Divakar

+0

77. Länge der Linse und Start_Zeitpunkte ist 75. – Rickson

Verwandte Themen