2017-02-21 8 views
2

Ich habe mir kürzlich selbst Python "beigebracht", um Daten für meine Experimente zu analysieren. Als solcher bin ich in vielen Aspekten ziemlich ahnungslos. Ich habe es geschafft, meine Analyse für bestimmte Dateien zu machen, aber in einigen Fällen bricht es zusammen und ich stelle mir vor, dass es das Ergebnis einer fehlerhaften Programmierung ist.Wie berechnet man Delta F/F mit Python?

Derzeit exportiere ich eine Datei mit 3 numply Arrays. Eines dieser Arrays ist mein Signal (float Werte von -10 bis 10). Was ich tun möchte, ist, jedes Datum in diesem Array auf einen Bereich von Werten zu normieren, die ihm vorausgehen. (dh der 30001ste Wert muss den Durchschnitt der vorhergehenden 3000 Werte subtrahiert haben und dann muss die Differenz durch diesen sehr gleichen Durchschnitt geteilt werden (die vorhergehenden 3000 Werte). Meine Daten werden mit einer Rate von 100 Hz gesammelt, um eine Normalisierung zu erhalten der Alst 30er Jahren muss ich die vorhergehenden 3000values ​​verwenden

wie dies stehen, wie ich es funktioniert haben es geschafft, zu.

dies das Signal in die Variable Fotosignal speichert

photosignal = np.array(seg.analogsignals[0], ndmin=1) 

jetzt das ist der Teil, den ich benutze, um zu bekommen die Delta-F/F über einem sich bewegenden Fenster von 30s

normalizedphotosignal = [(uu-(np.mean(photosignal[uu-3000:uu])))/abs(np.mean(photosignal[uu-3000:uu])) for uu in photosignal[3000:]] 

Die folgende fügt 3000-Werte an den Anfang, da die gleiche Länge der Anordnung zu halten später es in eine andere Liste Einrastzeit muß, die die gleiche ist, Länge

holder =list(range(3000)) 
normalizedphotosignal = holder + normalizedphotosignal 

Was ich bemerkt habe ist, dass in bestimmten Dateien dieser Code mir einen Fehler gibt, weil er sagt, dass die „Scheibe“ leer ist, und daher kann es nicht mit einem mittleren erstellen.

Ich denke, vielleicht gibt es eine bessere Möglichkeit, dies zu programmieren, die dieses Problem vollständig vermeiden könnte. Oder ist dies ein korrekter Weg, dieses Problem anzugehen?

Also habe ich die Lösung ausprobiert aber es ist ziemlich langsam und es gibt mir trotzdem noch den "leeren Scheibenfehler". Ich ging über die gleitenden Durchschnitt Post und fand diese Methode:

def running_mean(x, N): 
cumsum = np.cumsum(np.insert(x, 0, 0)) 
return (cumsum[N:] - cumsum[:-N])/N 

aber ich Probleme habe es zu meinem gewünschten Ausgangsentgegenkommend. nämlich (x-laufender Durchschnitt)/laufender Durchschnitt

Antwort

2

Ihr Ansatz geht in die richtige Richtung. Sie haben jedoch einen Fehler in Ihrem Listenverständnis gemacht: Sie verwenden uu als Ihren Index, während uu die Elemente Ihrer Eingabedaten photosignal sind.

Sie wollen etwas wie folgt aus:

normalizedphotosignal2 = np.zeros((photosignal.shape[0]-3000)) 
for i, uu in enumerate(photosignal[3000:]): 
    normalizedphotosignal2 = (uu - (np.mean(photosignal[i-3000:i])))/abs(np.mean(photosignal[i-3000:i])) 

Beachten Sie, dass for-Schleifen in Python relativ langsam sind. Wenn die Leistung hier ein Problem darstellt, können Sie versuchen, die for-Schleife zu vermeiden und stattdessen numpy-Methoden zu verwenden (z. B. unter Moving average or running mean).

Hoffe, das hilft.

+0

vielen Dank wird es zusammen mit den bewegenden Durchschnitt numpy Methoden ausprobieren, die Sie erwähnten! –

+1

Wo benutzt du 'i'? Meinst du "i-3000: i"? –

+0

@DavidCullen: Du hast Recht .. Ich habe vergessen, den Fehler zu beheben, den ich festgelegt habe ... –

2

Alles klar, also habe ich es endlich herausgefunden dank Ihrer Hilfe und der Beiträge, die Sie mir empfohlen haben.

Die Berechnung für meine gesamten Daten (300 000 +) dauert etwa eine Sekunde!

habe ich den folgenden Code:

def runningmean(x,N): 
    cumsum =np.cumsum(np.insert(x,0,0)) 
    return (cumsum[N:] -cumsum[:-N])/N 

photosignal = np.array(seg.analogsignal[0], ndmin =1) 

photosignalaverage = runningmean(photosignal, 3000) 
holder = np.zeros(2999) 
photosignalaverage = np.append(holder,photosignalaverage) 

detalfsignal = (photosignal-photosignalaverage)/abs(photosignalaverage) 

Fotosignal speichert mein Rohsignal in einem numpy Array. Photosignalalage verwendet cumsum, um den laufenden Durchschnitt aller Datenpunkte im Fotosignal zu berechnen. Ich füge dann die ersten 2999 Werte als 0 hinzu, um die gleiche Listengröße wie mein Fotosignal zu behalten.

Ich benutze dann grundlegende numpy Berechnungen, um mein Delta F/F Signal zu bekommen.

Vielen Dank noch einmal für das Feedback, war wirklich hilfreich!

Verwandte Themen