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
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
- 1. Wie nimmt man die String-Länge eines String-Arrays?
- 2. Holen Teil eines Arrays
- 3. Wie man Durchschnitt von zwei EPOCH Feldern in Hadoop nimmt?
- 4. Wie kann man einen Teil eines 2D-Arrays bekommen?
- 5. Den Durchschnitt eines Arrays mit JS finden
- 6. Wie erhält man den Mittelwert (Durchschnitt) für Elemente eines Benutzereingabefeldes?
- 7. Erstellen eines Arrays für jeden Monat nach dem heutigen Tag
- 8. Teil eines Arrays in Java zuweisen
- 9. Wie man Arrays innerhalb eines Arrays transponiert
- 10. Gruppierung von 2D-Numpy-Arrays im Durchschnitt
- 11. Karte für jeden Wert eines Arrays in einer Spark-Zeile
- 12. Sortierung Teil eines Arrays in Ruby
- 13. nur Teil eines Arrays in Java erhalten?
- 14. Einfache Formulartexteingabefelder als Teil eines Arrays
- 15. Wie berechnet man den Durchschnitt?
- 16. Wie kopiert man Teile eines 2D-Arrays?
- 17. wählt Durchschnitt der Top-3 für jeden spezifischen SQL-Auftrag
- 18. Wie nimmt man Parameterbedingungen?
- 19. Python: Wie mache ich jeden Teil des Arrays nur eine Ziffer lang?
- 20. Wie vergleicht man ein Array und einen Teil eines Vektors?
- 21. Berechnen Sie Durchschnitt in Arrays
- 22. Wie sortiere ich einen Teil eines Arrays mit Javascript?
- 23. Wie bekomme ich einen Teil eines mehrdimensionalen Arrays mit PHP?
- 24. Wie Collections.Shuffle rufen nur Teil eines Arrays Java
- 25. Wie Teil eines Arrays in Schleife zu verwenden?
- 26. Wie anhängen Daten in jedem Teil Array eines Arrays
- 27. Aufrufen eines Arrays innerhalb eines Arrays für Chef-Attribute
- 28. Compute Gradientennorm jeden Teil aus Verbundverlustfunktion
- 29. Wie lautet der korrekte Name für jeden durch Schrägstriche getrennten Teil eines Datei-/URL-Pfads?
- 30. Wie fügt man beim Laden der Seite jeden Wert eines Arrays in eine js-Funktion ein?
Wahrscheinlich 'reshape (A, [], 1000)' macht mehr Sinn, angesichts der Frage Definition –
@LuisMendo Hmm Ich denke, ich habe den anderen Weg der Verwendung der Länge jedes Abschnitts. – Divakar
'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