Calcular la media a través de la dimensión en una matriz 2D

82

Tengo una matriz acomo esta:

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

Necesito calcular la media para cada dimensión por separado, el resultado debería ser este:

[45, 10.5]

45siendo la media de a[*][0]y 10.5la media de a[*][1].

¿Cuál es la forma más elegante de resolver esto sin usar un bucle?

otmezger
fuente

Respuestas:

131

a.mean()toma un axisargumento:

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])

O, como función independiente:

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

La razón por la que la división no funcionaba es porque esta es la sintaxis para la división:

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

In [7]: a[:,1].mean() # second column
Out[7]: 10.5
askewchan
fuente
Gracias por su rápida respuesta. ¿Qué In [n]:significa? es esta parte del código?
otmezger
Estoy usando numpy, por lo que las líneas 2 y 3 funcionan muy bien, pero con en axis=0lugar deaxis=1
otmezger
@otmezger axis=0está en la siguiente línea. Edité para mostrar más información, ¿actualizar, tal vez?
askewchan
1
@otmezger De nada. Tenga en cuenta que muchos métodos de matriz numpy toman un argumento de eje como este.
askewchan
1
@askewchan: ¿qué significa mean = np.mean(a, axis=(0,2,3)) mean? saber que el tensor de entrada (a) tiene forma (lote, canal, ancho, alto)?
Rika
13

Aquí hay una solución no numpy:

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

Si haces esto mucho, NumPy es el camino a seguir.

Si por alguna razón no puede usar NumPy:

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