Berechnen Sie den Mittelwert über die Dimension in einem 2D-Array

79

Ich habe ein Array awie dieses:

a = [[40, 10], [50, 11]]

Ich muss den Mittelwert für jede Dimension separat berechnen. Das Ergebnis sollte folgendes sein:

[45, 10.5]

45der Mittelwert von a[*][0]und 10.5der Mittelwert von a[*][1].

Was ist die eleganteste Art, dies ohne Verwendung einer Schleife zu lösen?

otmezger
quelle

Antworten:

125

a.mean()nimmt ein axisArgument:

In [1]: import numpy as np

In [2]: a = np.array([[40, 10], [50, 11]])

In [3]: a.mean(axis=1)     # to take the mean of each row
Out[3]: array([ 25. ,  30.5])

In [4]: a.mean(axis=0)     # to take the mean of each col
Out[4]: array([ 45. ,  10.5])

Oder als eigenständige Funktion:

In [5]: np.mean(a, axis=1)
Out[5]: array([ 25. ,  30.5])

Der Grund, warum Ihr Slicing nicht funktioniert hat, ist, dass dies die Syntax für das Slicing ist:

In [6]: a[:,0].mean() # first column
Out[6]: 45.0

In [7]: a[:,1].mean() # second column
Out[7]: 10.5
askewchan
quelle
Danke für die schnelle Antwort. Was In [n]:bedeutet das? Ist das Teil des Codes?
Otmezger
Ich benutze numpy, also funktionieren Zeile 2 und 3 großartig, aber mit axis=0anstelle vonaxis=1
otmezger
@otmezger axis=0ist in der nächsten Zeile. Ich habe bearbeitet, um mehr Informationen anzuzeigen, vielleicht zu aktualisieren?
Askewchan
1
@otmezger Gern geschehen. Beachten Sie, dass viele Numpy-Array-Methoden genau so ein Achsenargument verwenden.
Askewchan
@askewchan: Was bedeutet es zu mean = np.mean(a, axis=(0,2,3)) mean? wissen, dass der Eingangstensor (a) eine Form hat (Charge, Kanal, Breite, Höhe)?
Rika
11

Hier ist eine nicht numpy Lösung:

>>> a = [[40, 10], [50, 11]]
>>> [float(sum(l))/len(l) for l in zip(*a)]
[45.0, 10.5]
Andrew Clark
quelle
4

Wenn Sie dies häufig tun, ist NumPy der richtige Weg.

Wenn Sie NumPy aus irgendeinem Grund nicht verwenden können:

>>> map(lambda x:sum(x)/float(len(x)), zip(*a))
[45.0, 10.5]
NPE
quelle