np.mean() vs. np.average() in Python NumPy?

Lesezeit: 4 Minuten

Benutzer-Avatar
Sibbs-Glücksspiel

Ich merke das

In [30]: np.mean([1, 2, 3])
Out[30]: 2.0

In [31]: np.average([1, 2, 3])
Out[31]: 2.0

Allerdings sollte es einige Unterschiede geben, da es sich schließlich um zwei unterschiedliche Funktionen handelt.

Was sind die Unterschiede zwischen ihnen?

  • Eigentlich macht die Dokumentation es nicht sofort klar, soweit ich sehen kann. Ich sage nicht, dass es unmöglich zu sagen ist, aber ich denke, diese Frage gilt trotzdem für Stack Overflow.

    – Schwarzes Gemüse

    18. November 2013 um 17:47 Uhr


  • numpy.mean : Gibt den Durchschnitt der Array-Elemente zurück.

    – Joaquín

    18. November 2013 um 17:47 Uhr

  • @joaquin: “Berechnen Sie das arithmetische Mittel entlang der angegebenen Achse.” vs “Berechnen Sie den gewichteten Durchschnitt entlang der angegebenen Achse.”?

    – Mixer

    19. November 2013 um 0:01 Uhr


  • @ Blender richtig. Ich habe nur versucht, eine Art lustige Antwort auf Ihren Kommentar zu geben, denn wenn ich Ihren Anweisungen folge, lese ich das erste, was ich in der docs für numpy.mean ist numpy.mean : Gibt den Durchschnitt der Array-Elemente zurück Das ist lustig, wenn Sie nach der Antwort auf die OP-Frage suchen.

    – Joaquín

    19. November 2013 um 16:05 Uhr

Benutzer-Avatar
Hammer

np.average akzeptiert einen optionalen Gewichtungsparameter. Wenn es nicht geliefert wird, sind sie gleichwertig. Schauen Sie sich den Quellcode an: Bedeuten, Durchschnitt

np.Mittelwert:

try:
    mean = a.mean
except AttributeError:
    return _wrapit(a, 'mean', axis, dtype, out)
return mean(axis, dtype, out)

np.Durchschnitt:

...
if weights is None :
    avg = a.mean(axis)
    scl = avg.dtype.type(a.size/avg.size)
else:
    #code that does weighted mean here

if returned: #returned is another optional argument
    scl = np.multiply(avg, 0) + scl
    return avg, scl
else:
    return avg
...

  • Warum bieten sie zwei verschiedene Funktionen? Anscheinend sollten sie einfach anbieten np.average seit weights ist schon optional. Scheint unnötig und dient nur dazu, Benutzer zu verwirren.

    – Geoff

    30. November 2015 um 22:03 Uhr

  • @Geoff Ich möchte lieber, dass sie eine NotImplementedException für “Durchschnitt” auslösen, um die Benutzer darüber aufzuklären, dass das arithmetische Mittel nicht mit “dem Durchschnitt” identisch ist.

    – FooBar

    26. Juni 2018 um 11:15 Uhr

np.mean berechnet immer ein arithmetisches Mittel und hat einige zusätzliche Eingabe- und Ausgabeoptionen (z. B. welche Datentypen verwendet werden sollen, wo das Ergebnis platziert werden soll).

np.average kann einen gewichteten Durchschnitt berechnen, wenn die weights Parameter geliefert wird.

Benutzer-Avatar
GM

In einigen Versionen von numpy Es gibt einen weiteren wichtigen Unterschied, den Sie beachten müssen:

average Berücksichtigen Sie keine Masken, berechnen Sie also den Durchschnitt über den gesamten Datensatz.

mean berücksichtigt Masken, berechnet also den Mittelwert nur über unmaskierte Werte.

g = [1,2,3,55,66,77]
f = np.ma.masked_greater(g,5)

np.average(f)
Out: 34.0

np.mean(f)
Out: 2.0

  • Notiz: np.ma.average funktioniert. Außerdem gibt es eine Fehlerbericht.

    – Neil G

    29. März 2017 um 1:53 Uhr


  • np.average und np.mean beides berücksichtigt Masken. Ich habe versucht und den Wert von “Out: 2.0

    – CEB

    30. Juni um 14:40 Uhr

  • @CEB die neue Version behebt wahrscheinlich den Fehler, danke für die Meldung

    – GR

    30. Juni um 16:42 Uhr

Benutzer-Avatar
Grant Petty

Zusätzlich zu den bereits erwähnten Unterschieden gibt es einen weiteren äußerst wichtigen Unterschied, den ich gerade auf die harte Tour entdeckt habe: anders np.mean, np.average erlaubt das nicht dtype Schlüsselwort, das in manchen Fällen unerlässlich ist, um korrekte Ergebnisse zu erhalten. Ich habe ein sehr großes Array mit einfacher Genauigkeit, auf das von an zugegriffen wird h5 Datei. Wenn ich den Mittelwert entlang der Achsen 0 und 1 nehme, erhalte ich völlig falsche Ergebnisse, es sei denn, ich gebe etwas an dtype="float64":

>T.shape
(4096, 4096, 720)
>T.dtype
dtype('<f4')

m1 = np.average(T, axis=(0,1))                #  garbage
m2 = np.mean(T, axis=(0,1))                   #  the same garbage
m3 = np.mean(T, axis=(0,1), dtype="float64")  # correct results

Leider können Sie nicht unbedingt sagen, dass Ihre Ergebnisse falsch sind, es sei denn, Sie wissen, wonach Sie suchen müssen. Ich werde nie verwenden np.average wieder aus diesem Grund aber immer verwenden np.mean(.., dtype="float64") auf jedem großen Array. Wenn ich einen gewichteten Durchschnitt möchte, berechne ich ihn explizit mit dem Produkt aus dem Gewichtsvektor und dem Zielarray und dann entweder np.sum oder np.meansoweit angemessen (auch mit angemessener Genauigkeit).

In Ihrem Aufruf sind die beiden Funktionen identisch.

average kann aber einen gewichteten Durchschnitt berechnen.

Doc-Links: mean und average

1054710cookie-checknp.mean() vs. np.average() in Python NumPy?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy