在Python中计算算术平均值(一种平均值)


267

Python中是否有内置或标准库方法来计算数字列表的算术平均值(一种平均值)?


平均值不明确-
众数

众数和中位数是集中趋势的其他度量。它们不是平均值。模式是在数据集中看到的最常见的值,不一定是唯一的。中位数是代表数据点中心的值。顾名思义,平均数有几种不同的类型,但均不同于中位数和众数计算。 purplemath.com/modules/meanmode.htm
Jarom,

@Jarom该链接与您不同意:“平均值,中位数和众数是三种“平均值””
Marcelo Cantos

Answers:


284

我不知道标准库中的任何内容。但是,您可以使用类似以下内容的方法:

def mean(numbers):
    return float(sum(numbers)) / max(len(numbers), 1)

>>> mean([1,2,3,4])
2.5
>>> mean([])
0.0

在numpy中,有numpy.mean()


20
一个常见的事情是要考虑的是,平均的[]0,它可以这样做float(sum(l))/max(len(l),1)
2015年

8
PEP 8 l是一个不好的变量名,因为它看起来很像1。另外,我会使用if l而不是if len(l) > 0。看到这里
zondo 2016年

1
你为什么叫max
1 -_-

3
参见上面的问题:避免被零除([])
Simon Fakir

5
空列表毫无意义。请不要假装他们这样做。
Marcelo Cantos

193

NumPy的a numpy.mean是算术平均值。用法很简单:

>>> import numpy
>>> a = [1, 2, 4]
>>> numpy.mean(a)
2.3333333333333335

6
numpy是安装在virtualenv中的噩梦。您应该真正考虑不使用此lib
vcarel 2014年

46
@vcarel:“ numpy是要在virtualenv中安装的噩梦”。我不确定你为什么这么说。过去确实如此,但在过去的一年或更长时间里,这一直很容易。

6
我必须对此发表评论。我目前在OSX的virtualenv中使用numpy,并且绝对没有问题(当前使用CPython 3.5)。
Juan Carlos Coto 2015年

4
使用Travis CI等持续集成系统,安装numpy会花费几分钟。如果快速而轻松的构建对您来说很有价值,而您只需要中庸,请考虑一下。
AkseliPalén'16

2
Travis CI上的 @AkseliPalén 虚拟环境可以使用通过apt-get使用系统站点软件包安装的numpy。即使只需要平均数,这可能足够快地使用。
Bengt

184

用途statistics.mean

import statistics
print(statistics.mean([1,2,4])) # 2.3333333333333335

从Python 3.4开始可用。对于3.1-3.3用户,该模块的旧版本可在PyPI上以的名称获得stats。只需更改statistics为即可stats


2
请注意,与其他解决方案相比,这非常慢。比较一下timeit("numpy.mean(vec))timeit("sum(vec)/len(vec)")并且timeit("statistics.mean(vec)")-后者比其他参数慢很多(在我的电脑上有时大于100)。这似乎是由于sum操作员中特别精确的实现所致statistics,请参阅PEPCode。不知道有关的大的性能差异的原因statistics._sumnumpy.sum,虽然。
jhin

10
@jhin这是因为statistics.mean尝试正确。它可以正确计算的平均值[1e50, 1, -1e50] * 1000
安蒂·哈帕拉

1
statistics.mean还将接受值的生成器表达式,所有len()用于除数的解决方案都会阻塞该表达式。
PaulMcG

54

您甚至不需要麻木或肮脏的...

>>> a = [1, 2, 3, 4, 5, 6]
>>> print(sum(a) / len(a))
3

24
那么mean([2,3])将给出2.小心浮点数。最好使用float(sum(l))/ len(l)。更好的是,请小心检查列表是否为空。
jesusiniesta

14
@jesusiniesta,但在python3中除外,在python3中除法可以达到预期的目的:除法
yota 2014年

11
在Python from __future__ import division
2.2及更高版本中

大数字和溢出怎么办?
obayhan

a = list()呢 提议的代码导致ZeroDivisionError
Ioannis Filippidis


7

除了强制浮动之外,您还可以执行以下操作

def mean(nums):
    return sum(nums, 0.0) / len(nums)

或使用lambda

mean = lambda nums: sum(nums, 0.0) / len(nums)

更新日期:2019-12-15

Python 3.8 在统计模块中添加了功能fmean。哪个更快,并且总是返回float。

将数据转换为浮点并计算算术平均值。

它的运行速度比mean()函数快,并且始终返回浮点数。数据可以是序列或可迭代的。如果输入数据集为空,则引发StatisticsError。

fmean([3.5,4.0,5.25])

4.25

3.8版的新功能。


2
from statistics import mean
avarage=mean(your_list)

例如

from statistics import mean

my_list=[5,2,3,2]
avarage=mean(my_list)
print(avarage)

结果是

3.0

1
def avg(l):
    """uses floating-point division."""
    return sum(l) / float(len(l))

例子:

l1 = [3,5,14,2,5,36,4,3]
l2 = [0,0,0]

print(avg(l1)) # 9.0
print(avg(l2)) # 0.0

1
def list_mean(nums):
    sumof = 0
    num_of = len(nums)
    mean = 0
    for i in nums:
        sumof += i
    mean = sumof / num_of
    return float(mean)

0

我一直认为应该avg从Builtins / stdlib中省略它,因为它很简单

sum(L)/len(L) # L is some list

并且任何告诫将在调用者代码中解决以供本地使用

注意事项:

  1. 非浮点结果:在python2中,9/4为2。解析,使用float(sum(L))/len(L)from __future__ import division

  2. 除以零:列表可能为空。解决:

    if not L:
        raise WhateverYouWantError("foo")
    avg = float(sum(L))/len(L)

0

对您问题的正确答案是使用statistics.mean。但是为了好玩,这是一个不使用该len()功能的Mean的版本,因此statistics.mean可以在不支持该功能的生成器上使用它(如)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)))

-2

其他人已经发布了很好的答案,但有些人可能仍在寻找找到Mean(avg)的经典方法,因此,我在这里发布了此信息(在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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.