Média é ambígua - moda e mediana também são médias comumente usados
jtlz2
Modo e mediana são outras medidas de tendência central. Eles não são médias. O modo é o valor mais comum visto em um conjunto de dados e não é necessariamente exclusivo. A mediana é o valor que representa o centro dos pontos de dados. Como a pergunta indica, existem alguns tipos diferentes de médias, mas todos são diferentes dos cálculos de mediana e modo. purplemath.com/modules/meanmode.htm
Jarom
@Jarom Esse link não concorda com você: 'Média, mediana e modo são três tipos de "médias"'
Marcelo Cantos
Respostas:
285
Não estou ciente de nada na biblioteca padrão. No entanto, você pode usar algo como:
numpy é um pesadelo para instalar em um virtualenv. Você realmente deve considerar não usar esta lib
vcarel
46
@ vcarel: "numpy é um pesadelo para instalar em um virtualenv". Não sei por que você diz isso. Costumava ser o caso, mas durante o último ano ou mais tem sido muito fácil.
6
Devo secundar esse comentário. Atualmente, estou usando numpy em uma virtualenv no OSX e não há absolutamente nenhum problema (atualmente usando o CPython 3.5).
Juan Carlos Coto
4
Com sistemas de integração contínua como o Travis CI, a instalação do numpy leva vários minutos extras. Se a construção rápida e leve é valiosa para você e você precisa apenas da média, considere.
Está disponível desde o Python 3.4. Para 3.1-3.3 usuários, uma versão antiga do módulo está disponível em PyPI sob o nome stats. Apenas mude statisticspara stats.
Observe que isso é extremamente lento quando comparado às outras soluções. Compare timeit("numpy.mean(vec)), timeit("sum(vec)/len(vec)")e timeit("statistics.mean(vec)")- o último é mais lento do que os outros por um fator enorme (> 100 em alguns casos no meu PC). Isso parece dever-se a uma implementação particularmente precisa do sumoperador statistics, consulte PEP e Código . Não tenho certeza sobre o motivo da grande diferença de desempenho entre statistics._sume numpy.sum, no entanto.
Jhin
10
@ jhin isso ocorre porque as statistics.meantentativas estão corretas . Calcula corretamente a média de [1e50, 1, -1e50] * 1000.
Antti Haapala
1
statistics.meantambém aceitará uma expressão geradora de valores, na qual todas as soluções usadas len()para o divisor serão bloqueadas.
PaulMcG 28/08/19
54
Você nem precisa de entorpecentes ou esquisitos ...
então médio ([2,3]) daria 2. cuidado com carros alegóricos. Melhor usar float (soma (l)) / len (l). Melhor ainda, tenha cuidado para verificar se a lista está vazia.
Jesusiniesta # 25/13
14
@jesusiniesta exceto em python3, onde a divisão faz o que se pretende fazer: dividir
Yota
11
E em Python 2.2 + se from __future__ import divisionno topo do seu programa
spiffytech
E quanto a grandes números e excesso?
obayhan
Que tal a = list()? O código proposto resulta em ZeroDivisionError.
Em vez de transmitir para flutuar, você pode fazer o seguinte
def mean(nums):return sum(nums,0.0)/ len(nums)
ou usando lambda
mean =lambda nums: sum(nums,0.0)/ len(nums)
ATUALIZAÇÕES: 2019-12-15
O Python 3.8 adicionou a função fmean ao módulo de estatísticas . O que é mais rápido e sempre retorna flutuação.
Converta dados em flutuadores e calcule a média aritmética.
Isso roda mais rápido que a função mean () e sempre retorna um float. Os dados podem ser uma sequência ou iteráveis. Se o conjunto de dados de entrada estiver vazio, gera um StatisticsError.
A resposta correta para sua pergunta é usar statistics.mean. Mas, por diversão, aqui está uma versão do mean que não usa a len()função, portanto (como statistics.mean) pode ser usada em geradores, que não suportam len():
from functools import reduce
from operator import truediv
def ave(seq):return truediv(*reduce(lambda a, b:(a[0]+ b[1], b[0]),
enumerate(seq, start=1),(0,0)))
Outros já postaram respostas muito boas, mas algumas pessoas ainda podem estar procurando uma maneira clássica de encontrar o Mean (avg), então aqui eu posto isto (código testado no Python 3.6):
def meanmanual(listt):
mean =0
lsum =0
lenoflist = len(listt)for i in listt:
lsum += i
mean = lsum / lenoflist
return float(mean)
a =[1,2,3,4,5,6]
meanmanual(a)Answer:3.5
Respostas:
Não estou ciente de nada na biblioteca padrão. No entanto, você pode usar algo como:
Em entorpecido, há
numpy.mean()
.fonte
[]
é0
, o que pode ser feito porfloat(sum(l))/max(len(l),1)
.l
é um nome de variável incorreto porque se parece muito com ele1
. Além disso, eu usariaif l
ao invés deif len(l) > 0
. Veja aquimax
?NumPy tem uma
numpy.mean
média aritmética. O uso é tão simples quanto isto:fonte
Use
statistics.mean
:Está disponível desde o Python 3.4. Para 3.1-3.3 usuários, uma versão antiga do módulo está disponível em PyPI sob o nome
stats
. Apenas mudestatistics
parastats
.fonte
timeit("numpy.mean(vec))
,timeit("sum(vec)/len(vec)")
etimeit("statistics.mean(vec)")
- o último é mais lento do que os outros por um fator enorme (> 100 em alguns casos no meu PC). Isso parece dever-se a uma implementação particularmente precisa dosum
operadorstatistics
, consulte PEP e Código . Não tenho certeza sobre o motivo da grande diferença de desempenho entrestatistics._sum
enumpy.sum
, no entanto.statistics.mean
tentativas estão corretas . Calcula corretamente a média de[1e50, 1, -1e50] * 1000
.statistics.mean
também aceitará uma expressão geradora de valores, na qual todas as soluções usadaslen()
para o divisor serão bloqueadas.Você nem precisa de entorpecentes ou esquisitos ...
fonte
from __future__ import division
no topo do seu programaa = list()
? O código proposto resulta emZeroDivisionError
.Use scipy:
fonte
Em vez de transmitir para flutuar, você pode fazer o seguinte
ou usando lambda
ATUALIZAÇÕES: 2019-12-15
O Python 3.8 adicionou a função fmean ao módulo de estatísticas . O que é mais rápido e sempre retorna flutuação.
fonte
por exemplo
e o resultado é
fonte
Exemplos:
fonte
fonte
Eu sempre acho que
avg
é omitido do builtins / stdlib porque é tão simples quantoe quaisquer advertências já seriam abordadas no código de chamada para uso local .
Advertências notáveis:
resultado não flutuante: em python2, 9/4 é 2. para resolver, usar
float(sum(L))/len(L)
oufrom __future__ import division
divisão por zero: a lista pode estar vazia. resolver:
fonte
A resposta correta para sua pergunta é usar
statistics.mean
. Mas, por diversão, aqui está uma versão do mean que não usa alen()
função, portanto (comostatistics.mean
) pode ser usada em geradores, que não suportamlen()
:fonte
Outros já postaram respostas muito boas, mas algumas pessoas ainda podem estar procurando uma maneira clássica de encontrar o Mean (avg), então aqui eu posto isto (código testado no Python 3.6):
fonte