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


191

Me doy cuenta de que

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

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

Sin embargo, debería haber algunas diferencias, ya que después de todo son dos funciones diferentes.

Cuáles son las diferencias entre ellos?


20
En realidad, la documentación no deja en claro de inmediato, por lo que puedo ver. No digo que sea imposible saberlo, pero creo que esta pregunta es válida para Stack Overflow de todos modos.
BlackVegetable

1
numpy.mean: devuelve el promedio de los elementos de la matriz.
Joaquín

@joaquin: "Calcular la media aritmética a lo largo del eje especificado". vs "Calcular el promedio ponderado a lo largo del eje especificado".
Blender

@Blender a la derecha. Solo estaba tratando de hacer una especie de respuesta divertida a tu comentario porque si sigo tus instrucciones, lo primero que leo en los documentos para numpy.mean es numpy.mean: Devuelve el promedio de los elementos de la matriz que es divertido si estás buscando la respuesta a la pregunta de OP.
Joaquín

Respuestas:


181

np.average toma un parámetro de peso opcional. Si no se suministra son equivalentes. Echa un vistazo al código fuente: media , media

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
...

6060
¿Por qué ofrecen dos funciones diferentes? Parece que deberían ofrecer np.averageya weightsque ya es opcional. Parece innecesario y solo sirve para confundir a los usuarios.
Geoff

66
@Geoff Prefiero que arrojen una excepción NotImplementedException para "promedio", para educar a los usuarios que la media aritmética no es idéntica a "el promedio".
FooBar

27

np.mean siempre calcula una media aritmética y tiene algunas opciones adicionales para entrada y salida (por ejemplo, qué tipos de datos usar, dónde colocar el resultado).

np.averagepuede calcular un promedio ponderado si weightsse proporciona el parámetro.


25

En alguna versión de numpy hay otra diferencia importante que debes tener en cuenta:

average No tome en cuenta las máscaras, por lo tanto, calcule el promedio de todo el conjunto de datos.

mean toma en cuenta las máscaras, así que calcule la media solo sobre los valores sin máscara.

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

1
Nota: np.ma.averagefunciona. Además, hay un informe de error .
Neil G

2

En su invocación, las dos funciones son las mismas.

average Sin embargo, puede calcular un promedio ponderado.

Doc enlaces: meanyaverage


0

Además de las diferencias ya señaladas, hay otra diferencia extremadamente importante que acabo de descubrir por el camino difícil: a diferencia np.mean, np.averageno permite la dtypepalabra clave, que es esencial para obtener resultados correctos en algunos casos. Tengo una matriz de precisión única muy grande a la que se accede desde un h5archivo. Si tomo la media a lo largo de los ejes 0 y 1, obtengo resultados completamente incorrectos a menos que especifique 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

Desafortunadamente, a menos que sepa qué buscar, no necesariamente puede decir que sus resultados son incorrectos. Nunca lo volveré a usar np.averagepor este motivo, pero siempre lo usaré np.mean(.., dtype='float64')en cualquier matriz grande. Si quiero un promedio ponderado, lo calcularé explícitamente usando el producto del vector de peso y la matriz de destino y luego np.sumo bien np.mean, según corresponda (con la precisión adecuada también).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.