2016-03-18 5 views
0

Hallo Ich möchte den Zeitunterschied von zwei Nullen der ersten Ableitung eines Signals berechnen. Nehmen wir zum Beispiel sagen, dass die erste Ableitung:Python: Wie finde ich das Zeitintervall zwischen Werten verschiedener Zeichen?

d =[-0.2, 0.3, 0.2, 0.2, -0.1, 0.5] 
t =[ 0, 13, 22, 23, 34, 50] 

ich ein Array c

c = [(13-0), (34-13), (50-34)], i.e. c = [12, 21, 16] 

Lasst uns haben wollen sagen, dass ich die ursprünglichen Daten für verschiedene user in pUser aufgezeichnet.

z = list() 
for i in user: 
    sort_ind = np.argsort(pUser.time[i]) 
    time_vec = pUser.time[i][sort_ind] 
    val_vec = pUser.val[i][sort_ind] 
    tmp0 = np.diff(val_vec) 
    s = np.sign(tmp0[0]) ## Sign of the first value (+1 or -1) 
    index = 0 
    zz = list() 
    for j in range(1,len(tmp0)): 
     if (np.sign(tmp0[j]) + s)==0: 
      s = np.sign(tmp0[j]) 
      dt = (time_vec[j]-time_vec[index])/(2*np.timedelta64(1, 's')) 
      zz.append(dt) 
      index = j 
    z.append(zz) 

Aber wegen len(tmp0) ~ 10^4-10^5 dauert diese Schleife eine Weile. Ich frage mich, ob es einen schnelleren Weg gibt, diese Schleife zu vermeiden.

+0

'10^9'? Das wird schwer .. – JeD

+0

Eigentlich weniger, sorry, ich habe die Größe geändert – emax

+0

Kann ich fragen, wie lange es für Sie dauert? – JeD

Antwort

0

Wie wäre es eine reine numpy Antwort:

import numpy as np 

a = np.array([[-0.2, 0.3, 0.2, 0.2, -0.1, 0.5], 
       [ 0, 13, 22, 23, 34, 50]]) 

# mask of all the positive values 
sign = a[0] > 0 

# mask of any location where the sign changed 
mask = np.insert(sign[:-1]^sign[1:], 0, True) 

# mask all the sign changes and diff 
c = np.diff(a[1,mask]) 

Ausgang

In [2]: c 
Out[2]: array([ 13., 21., 16.]) 
Verwandte Themen