numpy.mean si usted puede permitirse la instalación de numpy
Mitch
77
sum(L) / float(len(L)). manejar listas vacías en el código de la persona que llama comoif not L: ...
n611x007
44
@mitch: no es cuestión de si puedes permitirte instalar numpy. numpy es una palabra completa en sí misma. Es si realmente necesitas numpy. Instalar numpy, una extensión de 16mb C, para el cálculo medio sería, bueno, muy poco práctico, para alguien que no lo use para otras cosas.
si la lista está compuesta por ints, el resultado en python 2 será un int
mitch el
Eso es perfecto ! lo siento por la estúpida pregunta, ¡pero realmente he buscado por todas partes eso! Muchas gracias !
Carla Dessi
77
Como dije, soy nuevo en esto, estaba pensando que tendría que hacerlo con un bucle o algo así para contar la cantidad de números, no me di cuenta de que podía usar la longitud. esto es lo primero que he hecho con python ..
Carla Dessi
2
¿Qué pasa si la suma es un número masivo que no cabe en int / float?
Usuario de Foo Bar
55
@FooBarUser, entonces debe calcular k = 1.0 / len (l), y luego reducir: reduce (lambda x, y: x + y * k, l)
Eso es extraño. Habría asumido que esto sería mucho más eficiente, pero parece tomar 8 veces más tiempo en una lista aleatoria de carrozas que simplementesum(l)/len(l)
L. Amber O'Hearn
8
Ah, pero np.array(l).mean()es mucho más rápido.
L. Amber O'Hearn el
8
@ L.AmberO'Hearn, acabo cronometré y np.mean(l)y np.array(l).meanse refieren a la misma velocidad, y sum(l)/len(l)es aproximadamente el doble de rápido. Solía l = list(np.random.rand(1000)), por supuesto, ambos numpymétodos se vuelven mucho más rápidos si les así numpy.array.
Akavall
11
bueno, a menos que esa sea la única razón para instalar numpy. Instalar un paquete de 16mb C de cualquier fama para el cálculo medio parece muy extraño en esta escala.
n611x007
pero en mi mente. no hay necesidad de preocuparse por la velocidad en condiciones normales ..
tyan
230
Se ha agregado un módulo de estadísticas a Python 3.4 . Tiene una función para calcular el promedio llamado media . Un ejemplo con la lista que proporcionó sería:
from statistics import mean
l =[15,18,2,36,12,78,5,6,9]
mean(l)
Esta es la respuesta más elegante porque emplea un módulo de biblioteca estándar que está disponible desde python 3.4.
Serge Stroobandt
44
Y es numéricamente más estable
Antti Haapala
Y produce un error más agradable si accidentalmente pasa una lista vacía en statistics.StatisticsError: mean requires at least one data pointlugar de una más críptica ZeroDivisionError: division by zeropara la sum(x) / len(x)solución.
Boris el
45
¿Por qué reduce()usarías esto cuando Python tiene una sum()función perfectamente cromulenta ?
print sum(l)/ float(len(l))
( float()Es necesario forzar a Python a hacer una división de punto flotante).
Entiendo que esto es solo por diversión, pero devolver 0 para una lista vacía puede no ser lo mejor que se puede hacer
Johan Lundberg
1
@JohanLundberg: podría reemplazar el 0 con False como el último argumento reduce()que le daría False para una lista vacía, de lo contrario, el promedio como antes.
Andrew Clark
@AndrewClark ¿por qué se fuerza floatel len?
EndermanAPM
8
Intenté usar las opciones anteriores pero no funcionó. Prueba esto:
from statistics import mean
n =[11,13,15,17,19]print(n)print(mean(n))
Bueno. ¡Cualquier otra respuesta no notó el peligro de la lista vacía!
wsysuper
1
Devolver False(equivalente al número entero 0) es la peor forma posible de manejar este error. Es mejor atrapar ZeroDivisionErrory criar algo mejor (tal vez ValueError).
poco
@kindall, ¿cómo es un ValueErrormejor que un ZeroDivisionError? Este último es más específico, además parece un poco innecesario detectar un error aritmético solo para volver a lanzar uno diferente.
MatTheWhale
Porque ZeroDivisionErrorsolo es útil si sabe cómo se está haciendo el cálculo (es decir, que está involucrada una división por la longitud de la lista). Si no lo sabe, no le dice cuál es el problema con el valor que pasó. Mientras que su nueva excepción puede incluir esa información más específica.
poco
4
Como principiante, acabo de codificar esto:
L =[15,18,2,36,12,78,5,6,9]
total =0def average(numbers):
total = sum(numbers)
total = float(total)return total / len(numbers)print average(L)
Para usar reducepara tomar un promedio de ejecución, necesitará rastrear el total pero también el número total de elementos vistos hasta ahora. Como ese no es un elemento trivial en la lista, también tendrá que pasar reduceun argumento adicional para plegar.
Ambos pueden darle valores cercanos a valores similares en un entero o al menos 10 valores decimales. Pero si realmente está considerando valores flotantes largos, ambos pueden ser diferentes. El enfoque puede variar en lo que desea lograr.
>>> l =[15,18,2,36,12,78,5,6,9]>>>print reduce(lambda x, y: x + y, l)/ len(l)20>>> sum(l)/len(l)20
Valores flotantes
>>>print reduce(lambda x, y: x + y, l)/ float(len(l))20.1111111111>>>print sum(l)/float(len(l))20.1111111111
x = [[-5.01,-5.43,1.08,0.86,-2.67,4.94,-2.51,-2.25,5.56,1.03],
[-8.12,-3.48,-5.52,-3.78,0.63,3.29,2.09,-2.13,2.86,-3.33],
[-3.68,-3.54,1.66,-4.11,7.39,2.08,-2.59,-6.94,-2.26,4.33]]
puede notar que xtiene una dimensión 3 * 10 si necesita obtener el meanpara cada fila, puede escribir esto
Combinando un par de las respuestas anteriores, se me ocurrió lo siguiente que funciona con reducción y no supone que tenga Ldisponible dentro de la función de reducción:
from operator import truediv
L =[15,18,2,36,12,78,5,6,9]def sum_and_count(x, y):try:return(x[0]+ y, x[1]+1)exceptTypeError:return(x + y,2)
truediv(*reduce(sum_and_count, L))# prints 20.11111111111111
numbers =[0,1,2,3]
numbers[0]= input("Please enter a number")
numbers[1]= input("Please enter a second number")
numbers[2]= input("Please enter a third number")
numbers[3]= input("Please enter a fourth number")print(numbers)print("Finding the Avarage")
avarage = int(numbers[0])+ int(numbers[1])+ int(numbers[2])+ int(numbers [3])/4print(avarage)
sum(L) / float(len(L))
. manejar listas vacías en el código de la persona que llama comoif not L: ...
Respuestas:
En Python 3.4+ puedes usar
statistics.mean()
En versiones anteriores de Python puedes hacer
En Python 2 necesitas convertir
len
a un flotador para obtener la división de flotadorNo hay necesidad de usar
reduce
. Es mucho más lento y se eliminó en Python 3.fuente
fuente
from __future__ import division
, puede eliminar eso feofloat
.float
es feo como el infierno, solo quería que sea más simple.sum(l, 0.0) / len(l)
sum(l) / len(l)
Puedes usar
numpy.mean
:fuente
sum(l)/len(l)
np.array(l).mean()
es mucho más rápido.np.mean(l)
ynp.array(l).mean
se refieren a la misma velocidad, ysum(l)/len(l)
es aproximadamente el doble de rápido. Solíal = list(np.random.rand(1000))
, por supuesto, ambosnumpy
métodos se vuelven mucho más rápidos sil
es asínumpy.array
.Se ha agregado un módulo de estadísticas a Python 3.4 . Tiene una función para calcular el promedio llamado media . Un ejemplo con la lista que proporcionó sería:
fuente
statistics.StatisticsError: mean requires at least one data point
lugar de una más crípticaZeroDivisionError: division by zero
para lasum(x) / len(x)
solución.¿Por qué
reduce()
usarías esto cuando Python tiene unasum()
función perfectamente cromulenta ?(
float()
Es necesario forzar a Python a hacer una división de punto flotante).fuente
float()
no es necesario en Python 3.Hay una biblioteca de estadísticas si está usando python> = 3.4
https://docs.python.org/3/library/statistics.html
Puede usar su método malo como este. Supongamos que tiene una lista de números de los cuales desea encontrar significa:
También tiene otros métodos como stdev, varianza, modo, media armónica, mediana, etc., que son demasiado útiles.
fuente
En lugar de lanzar para flotar, puede agregar 0.0 a la suma:
fuente
sum(l) / float(len(l))
es la respuesta correcta, pero solo para completar puede calcular un promedio con una sola reducción:Tenga en cuenta que esto puede provocar un ligero error de redondeo:
fuente
reduce()
que le daría False para una lista vacía, de lo contrario, el promedio como antes.float
ellen
?Intenté usar las opciones anteriores pero no funcionó. Prueba esto:
trabajó en python 3.5
fuente
O use
pandas
elSeries.mean
método de:Manifestación:
De los documentos:
Y aquí están los documentos para esto:
Y toda la documentación:
fuente
Tenía una pregunta similar que resolver en los problemas de Udacity. En lugar de una función incorporada, codifiqué:
Mucho más tiempo de lo habitual, pero para un principiante es bastante desafiante.
fuente
False
(equivalente al número entero0
) es la peor forma posible de manejar este error. Es mejor atraparZeroDivisionError
y criar algo mejor (tal vezValueError
).ValueError
mejor que unZeroDivisionError
? Este último es más específico, además parece un poco innecesario detectar un error aritmético solo para volver a lanzar uno diferente.ZeroDivisionError
solo es útil si sabe cómo se está haciendo el cálculo (es decir, que está involucrada una división por la longitud de la lista). Si no lo sabe, no le dice cuál es el problema con el valor que pasó. Mientras que su nueva excepción puede incluir esa información más específica.Como principiante, acabo de codificar esto:
fuente
sum(l)/len(l)
es , con mucho, la respuesta más elegante (no es necesario realizar conversiones de tipo en Python 3).Si desea obtener algo más que la media (también conocido como promedio), puede consultar las estadísticas desordenadas
fuente
Para usar
reduce
para tomar un promedio de ejecución, necesitará rastrear el total pero también el número total de elementos vistos hasta ahora. Como ese no es un elemento trivial en la lista, también tendrá que pasarreduce
un argumento adicional para plegar.fuente
Ambos pueden darle valores cercanos a valores similares en un entero o al menos 10 valores decimales. Pero si realmente está considerando valores flotantes largos, ambos pueden ser diferentes. El enfoque puede variar en lo que desea lograr.
Valores flotantes
@Andrew Clark tenía razón en su declaración.
fuente
suponer que
x = [[-5.01,-5.43,1.08,0.86,-2.67,4.94,-2.51,-2.25,5.56,1.03], [-8.12,-3.48,-5.52,-3.78,0.63,3.29,2.09,-2.13,2.86,-3.33], [-3.68,-3.54,1.66,-4.11,7.39,2.08,-2.59,-6.94,-2.26,4.33]]
puede notar que
x
tiene una dimensión 3 * 10 si necesita obtener elmean
para cada fila, puede escribir estono te olvides de
import numpy as np
fuente
fuente
Encuentre el promedio en la lista utilizando el siguiente código PYTHON :
Intenta esto con facilidad.
fuente
o como publicado anteriormente
El 1.0 es para asegurarse de obtener una división de coma flotante
fuente
Combinando un par de las respuestas anteriores, se me ocurrió lo siguiente que funciona con reducción y no supone que tenga
L
disponible dentro de la función de reducción:fuente
Quiero agregar solo otro enfoque
fuente
fuente