2016-12-08 3 views
1

Angenommen, ich habe ein 500000x1 Array namens A. Ich möchte dieses Array in 1000 gleiche Abschnitte teilen und dann den Mittelwert dieses Abschnitts berechnen. Also werde ich am Ende mit einem 1000x1 Array namens B, in dem B[1] ist der Mittelwert von A[1:500], B[2] ist der Mittelwert von B [501: 1000], und so weiter. Da ich das viele Male machen werde, möchte ich es effizient machen. Was ist der effektivste Weg, dies in Matlab/Python zu tun?Wie man Durchschnitt für jeden Teil eines Arrays nimmt

Antwort

3

NumPy/Python

Wir umformen könnte 500 Spalten haben und dann entlang der zweiten Achse berechnen Durchschnitt -

A.reshape(-1,500).mean(axis=1) 

Probelauf -

In [89]: A = np.arange(50)+1; 

In [90]: A.reshape(-1,5).mean(1) 
Out[90]: array([ 3., 8., 13., 18., 23., 28., 33., 38., 43., 48.]) 

Runtime-Test:

Eine alternative Methode, um diese Durchschnittswerte zu erhalten, wäre die altmodische Methode, die Summe zu berechnen und dann durch die Anzahl der an der Summierung beteiligten Elemente zu dividieren. Lassen Sie uns Zeit diese beiden Methoden -

In [107]: A = np.arange(500000)+1; 

In [108]: %timeit A.reshape(-1,500).mean(1) 
1000 loops, best of 3: 1.19 ms per loop 

In [109]: %timeit A.reshape(-1,500).sum(1)/500.0 
1000 loops, best of 3: 583 µs per loop 

Scheint, wie durchaus eine Verbesserung dort mit der alternativen Methode! Aber warten Sie, es ist, weil mit mean Methode NumPy in Float-Typ standardmäßig konvertiert und dass Conversion Overhead hier angezeigt wurde.

Wenn wir also Schwimmer Typ Eingabe-Arrays verwenden, würden wir eine andere und eine faire Szenario haben -

In [144]: A = np.arange(500000).astype(float)+1; 

In [145]: %timeit A.reshape(-1,500).mean(1) 
1000 loops, best of 3: 534 µs per loop 

In [146]: %timeit A.reshape(-1,500).sum(1)/500.0 
1000 loops, best of 3: 516 µs per loop 

MATLAB

mit säulen großen Ordnung, würden wir umformen 500 Zeilen haben und dann entlang der ersten Dimension gemittelt werden -

mean(reshape(A,500,[]),1) 

Probelauf -

>> A = 1:50;      
>> mean(reshape(A,5,[]),1)   
ans = 
    3  8 13 18 23 28 33 38 43 48 

Runtime-Test: Auch

Lasst uns hier auf die altmodische Art und Weise ausprobieren -

>> A = 1:500000; 
>> func1 = @() mean(reshape(A,500,[]),1); 
>> timeit(func1)       
ans = 
    0.0013021 
>> func2 = @() sum(reshape(A,500,[]),1)/500.0; 
>> timeit(func2)        
ans = 
    0.0012291 
+0

Wahrscheinlich 'reshape (A, [], 1000)' macht mehr Sinn, angesichts der Frage Definition –

+0

@LuisMendo Hmm Ich denke, ich habe den anderen Weg der Verwendung der Länge jedes Abschnitts. – Divakar

+0

'np.mean (x)' ist hier gleichbedeutend mit 'np.sum (x, dtype = float)/500'. Ihre 'Summe' ohne den' dtype' ist schneller, weil sie 'uint32' hinzufügt, nicht' float64', und es besteht die Gefahr eines Überlaufs. Es ist nicht so, dass Matlab schlau ist, es ist, dass es vorsichtiger ist – Eric

Verwandte Themen