2016-11-28 7 views
2

Ich habe einen Vektor X, der aus N = 10e6 Werte besteht. Ich möchte den Mittelwert für die zunehmenden Paare berechnen. Zum Beispiel:Pythonic-Methode, um Mittelwerte über einen großen Datensatz zu bewerten

for i in range(0,N-1): 
    Ex[i] = X[0:i+1].mean() 

Dies ist eine schrecklich ineffiziente Art, dies zu tun. Was wäre ein intelligenterer Algorithmus für Python? Hinweis Ex und X sind beide numpy Arrays von Float-Werten.

+0

Sie müssen vielleicht Ihre eigene 'mean' und koppeln es mit so etwas wie' schreiben itertools.accumulate' –

+1

Sie könnten 'numpy.cumsum' verwenden und nach Index dividieren. –

+2

@YakymPirozhenko Stellen Sie das als Antwort bereit. – Divakar

Antwort

7

A numpy -centric Lösung könnte wie folgt aussehen:

X = np.random.rand(10**6) 
EX = np.cumsum(X)/np.arange(1, X.shape[0]+1) 
+1

Sie können das 'float' Array für die Division verwenden:' np.arange (..). Astype (float) 'falls' X' ints ist. – Divakar

+0

@Divakar wegen Python 2 '/' floor division? –

+1

@ juanpa.arrivillaga Ja, das ist das py2-Ding. Oder man kann auch 'numpy.true_divide()' verwenden. – Divakar

3

nicht ein numpy Experte, aber dies vermeidet die Berechnung der Summe der Elemente jedes Mal. Nur akkumulieren die Summe:

current_sum = 0.0 
for i in range(0,N-1): 
    current_sum += X[i] 
    Ex[i] = current_sum/(i+1) 
+0

Dies ist schon wesentlich schneller und so eine offensichtliche Lösung. Vielen Dank. – gutelfuldead

Verwandte Themen