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

189

Das merke ich

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

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

Es sollte jedoch einige Unterschiede geben, da es sich schließlich um zwei verschiedene Funktionen handelt.

Was sind die Unterschiede zwischen ihnen?

Sibbs Glücksspiel
quelle
20
Eigentlich macht die Dokumentation nicht sofort klar, soweit ich sehen kann. Nicht zu sagen, dass es unmöglich ist zu sagen, aber ich denke, diese Frage gilt trotzdem für Stack Overflow.
BlackVegetable
1
numpy.mean: Gibt den Durchschnitt der Array-Elemente zurück.
Joaquin
@joaquin: "Berechne das arithmetische Mittel entlang der angegebenen Achse." vs "Berechnen Sie den gewichteten Durchschnitt entlang der angegebenen Achse."?
Blender
@Blender rechts. Ich habe nur versucht , eine Art lustige Antwort auf Ihren Kommentar zu machen , weil , wenn ich Ihre Anweisungen das erste , was ich in den lesen folgen docs für numpy.mean ist numpy.mean: Gibt den Durchschnitt der Array - Elemente , die lustig ist , wenn Sie sind Suche nach der Antwort auf die OP-Frage.
Joaquin

Antworten:

180

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

np.mean:

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

np.average:

...
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
...
Hammer
quelle
59
Warum bieten sie zwei verschiedene Funktionen? Scheint, sie sollten nur anbieten, np.averageda dies weightsbereits optional ist. Scheint unnötig und dient nur dazu, Benutzer zu verwirren.
Geoff
6
@Geoff Ich möchte lieber, dass sie eine NotImplementedException für "Durchschnitt" auslösen, um den Benutzern mitzuteilen, dass das arithmetische Mittel nicht mit "dem Durchschnitt" identisch ist.
FooBar
26

np.mean berechnet immer ein arithmetisches Mittel und verfügt über einige zusätzliche Optionen für die Eingabe und Ausgabe (z. B. welche Datentypen verwendet werden sollen, wo das Ergebnis platziert werden soll).

np.averagekann einen gewichteten Durchschnitt berechnen, wenn der weightsParameter angegeben wird.

Bernstein
quelle
24

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

average Berücksichtigen Sie keine Masken. Berechnen Sie daher den Durchschnitt über den gesamten Datensatz.

mean Berücksichtigt Masken, berechnen Sie den Mittelwert also nur über nicht maskierte 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
GM
quelle
1
Hinweis: np.ma.averagefunktioniert. Es gibt auch einen Fehlerbericht .
Neil G
2

In Ihrem Aufruf sind die beiden Funktionen gleich.

average kann jedoch einen gewichteten Durchschnitt berechnen.

Doc Links: meanundaverage

Prashant Kumar
quelle
0

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: Im Gegensatz dazu np.meanist np.averagedas dtypeSchlüsselwort nicht zulässig, was in einigen Fällen für die Erzielung korrekter Ergebnisse unerlässlich ist. Ich habe ein sehr großes Array mit einfacher Genauigkeit, auf das über eine h5Datei zugegriffen wird. Wenn ich den Mittelwert entlang der Achsen 0 und 1 nehme, erhalte ich völlig falsche Ergebnisse, es sei denn, ich gebe Folgendes 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

Wenn Sie nicht wissen, wonach Sie suchen müssen, können Sie leider nicht unbedingt sagen, dass Ihre Ergebnisse falsch sind. Ich werde np.averageaus diesem Grund nie wieder verwenden, aber immer np.mean(.., dtype='float64')auf einem großen Array verwenden. Wenn ich einen gewichteten Durchschnitt möchte, berechne ich ihn explizit unter Verwendung des Produkts aus dem Gewichtsvektor und dem Zielarray und dann entweder np.sumoder np.meannach Bedarf (auch mit angemessener Genauigkeit).

Grant Petty
quelle