2016-04-23 5 views
0

Ich arbeite mit numpy.convolve. Um ehrlich zu sein, bin ich mir nicht sicher, ob ich das richtige Modul für das Projekt verwende, an dem ich arbeite. Frage: Ich will numpy falten (oder wenn es ein anderes Modul, das ich implementieren kann), um vorherige Nummern nicht zu ändern. Hinzufügen. Ich möchte nicht, dass sich die alten Zahlen ändern, ich möchte, dass sie repariert werden. Wenn ich neue Daten bekomme, ist die einzige Zahl, die betroffen sein sollte, die neue, nicht der Rest. Hiernumpy.convolve Python alte Zahlen können nicht geändert werden

ein Beispiel: (. Zu klären, ist es besser)

import numpy 

N = 3 
numbers = [11,-5,54,-100,1] 
numbers_mean = numpy.convolve(numbers, numpy.ones((N,))/N)[(N-1):] 
print numbers_mean 

Ausgang:

[ 20.   -17.   -15.   -33.   0.33333333] 

ABER Wenn ich ändern, um die letzte Zahl auf 100 statt 1 ändert sich das Ergebnis alle 3 Nummern.

N = 3 
numbers = [11,-5,54,-100,100] 
numbers_mean = numpy.convolve(numbers, numpy.ones((N,))/N)[(N-1):] 
print numbers_mean 

Ausgang:

[ 20.   -17.   18.   0.   33.33333333] 

GERADE DIE AUSGÄNGE: . .

[ 20.   -17.   -15.   -33.   0.33333333] 
[ 20.   -17.   18.   0.   33.33333333] 

Das ist was ich sehen will:

[ 20.   -17.   -15.   -33.   33.33333333<- this number only should change not the rest] 

So wie Sie sehen können, wenn die Zahl von 1 bis 100 geht es die -33 verändert. zu 0. das ist nicht das, was ich will Ich möchte alle diese Zahlen zu festen und keine Änderung der einzigen Zahl, die in der Lage sein sollte zu ändern ist die neueste Nummer. in diesem Fall 33.333333 von 0.3333

Gibt es irgendein Modul oder Weg, wie ich dies in Python implantieren kann.

Danke

Antwort

1

IIUC, Sie 3-Nachbarschaft Mittel berechnet werden soll. Sie haben also eine mask=[1./3,1./3,1./3] welche Größe N ist.

Sehen Sie, was auf ein einfacheres Beispiel passieren, numbers = [0,1,2,3,4], die Größe M>=N ist:

In [1]: numpy.convolve(numbers,mask) 
Out[1]: 
array([ 0.  , 0.33333333, 1.  , 2.  , 3.  , 
     2.33333333, 1.33333333]) 

Dies ist ein Array mit N+M-1 Elementen. Es gibt nur M-2(N-1) gültige Mittel, [1,2,3] hier, und N-1 überlappende Mittel am Anfang und am Ende: Sie müssen sie auch verwerfen.

Für Ihren Fall:

N = 3 
a1 = [11,-5,54,-100,1] 
a2 = [11,-5,54,-100,100] 

mask=numpy.ones(N)/N 
m1= numpy.convolve(a1, mask)[(N-1):-(N-1)] 
m2= numpy.convolve(a2, mask)[(N-1):-(N-1)] 
print (m1,m2) 

# [ 20. -17. -15.] [ 20. -17. 18.] 

nur das letzte Glied betroffen ist.

EDIT

  • die N-1 letzten Bedingungen zu vermeiden, ein anderer Ansatz ist scipy.signal.lfilter, zu verwenden, die Unterschiede Gleichungen implementieren:

Hier mean(n) - mean(n-1) = data(n)/N -data(n-N)/N.

from scipy.signal import lfilter 
N=3 
a=np.array([1,-1]) 
b=np.concatenate(([1],np.zeros(N-1),[-1]))/N 
x=np.arange(5) 
means=lfilter(b,a,x) 
# array([0.,0.3333,1.,2.,3.]) 
+0

Was wäre die Berechnung auf der 4. Nummer? Ich kann die Daten nicht verzögern. es muss führen. Also müssen alle Zahlen eine Berechnung haben, wenn ich zum Beispiel 5 Zahlen habe, möchte ich den Durchschnitt finden [2 + 3 + 4 + 1 + 8]/5 = 3,6. Als nächstes bekomme ich neue Daten Nun habe ich insgesamt 6 Zahlen [2 + 3 + 4 + 1 + 8 + 4] und ich möchte sie wieder durch 5 teilen (IMMER lässt sich sagen) jetzt nehme ich [3 + 4 + 1 + 8 +4]/5 = 4. Wieder bekomme ich neue Daten, jetzt habe ich insgesamt 7 Zahlen [2 + 3 + 4 + 1 + 8 + 4 + 9] und dividiere ich durch 5 [4 + 1 + 8 + 4 + 9]/5 = 5.2. Das ist es, was ich zusammenfalten möchte. ist es möglich??? –

+1

Ich schlug einen anderen Ansatz vor, aber ich bin mir nicht sicher, ob ich Ihr Ziel verstehe. Alle diese Methoden müssen alle Mittel für jede neue Daten neu berechnen. –

+0

danke für die Klärung der Convole für mich. Außerdem werde ich diese Formel tmwr auf meine vollständigen Daten versuchen. das einzige was nullen sollte np.zeros sein und anordnen sollte np.angegangen sein denke ich. :) Danke nochmal –

0

ich bin kein Experte numpy, so gebe ich Ihnen eine Python-Lösung für das vorschlagen:

In [342]: fixed = np.convolve([11,-5,54,-100,1], np.ones((N,))/N)[(N-1):-1] 

In [343]: fixed 
Out[343]: array([ 20., -17., -15., -33.]) 

In [344]: np.append(fixed, np.convolve([11,-5,54,-100,100], np.ones((N,))/N)[-1]) 
Out[344]: array([ 20.  , -17.  , -15.  , -33.  , 33.33333333]) 
+0

Diese Art von Arbeiten das einzige Problem ist, ändert es nur die letzte Nummer. Ich brauche es um alle 3 Nummern zu machen. also spiegeln die ganzen Daten den echten Stochastik wider. Irgendein Rat? –