【问题标题】:Calculating arithmetic mean (one type of average) in Python [duplicate]在Python中计算算术平均值(一种平均值)
【发布时间】:2011-12-04 16:54:56
【问题描述】:

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

【问题讨论】:

  • 平均值不明确 - 众数和中位数也是常用的平均值
  • 众数和中位数是集中趋势的其他度量。它们不是平均值。众数是数据集中最常见的值,不一定是唯一的。中位数是表示数据点中心的值。正如问题所暗示的,有几种不同类型的平均值,但都不同于中位数和众数计算。 purplemath.com/modules/meanmode.htm
  • @Jarom 那个链接不同意你的观点:'平均值、中位数和众数是三种“平均值”'

标签: python list mean


【解决方案1】:

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

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

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

在 numpy 中,有 numpy.mean()

【讨论】:

  • 一个常见的事情是考虑[]的平均值是0,这可以通过float(sum(l))/max(len(l),1)来完成。
  • PEP 8 says l 是一个错误的变量名,因为它看起来很像 1。另外,我会使用if l 而不是if len(l) > 0。见here
  • 你为什么打电话给max
  • 见上面的问题:避免被零除(for [])
  • 空列表没有意义。请不要假装他们这样做。
【解决方案2】:

NumPy 有一个numpy.mean,它是一个算术平均值。用法就这么简单:

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

【讨论】:

  • numpy 是安装在 virtualenv 中的噩梦。你真的应该考虑不使用这个库
  • @vcarel:“numpy 是安装在 virtualenv 中的噩梦”。我不知道你为什么这么说。过去是这样,但在过去一年或更长时间里,这很容易。
  • 我必须支持这条评论。我目前在 OSX 的 virtualenv 中使用 numpy,绝对没有问题(目前使用 CPython 3.5)。
  • 使用像 Travis CI 这样的持续集成系统,安装 numpy 需要额外的几分钟。如果快速轻巧的构建对您很有价值,并且您只需要平均值,请考虑。
  • @AkseliPalén virtual environments on Travis CI can use a numpy installed via apt-get using the system site packages。即使只需要一个平均值,这也可能很快就可以使用。
【解决方案3】:

使用statistics.mean:

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

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

【讨论】:

  • 请注意,与其他解决方案相比,这非常慢。比较timeit("numpy.mean(vec))timeit("sum(vec)/len(vec)")timeit("statistics.mean(vec)")——后者比其他的慢很多(在我的电脑上某些情况下>100)。这似乎是由于在statistics 中特别精确地实现了sum 运算符,请参阅PEPCode。不过,不确定statistics._sumnumpy.sum 之间性能差异很大的原因。
  • @jhin 这是因为statistics.mean 试图正确。它正确计算了[1e50, 1, -1e50] * 1000 的平均值。
  • statistics.mean 还将接受值的生成器表达式,所有使用 len() 作为除数的解决方案都会阻塞。
  • 从python 3.8开始,有了更快的statistics.fmean函数
【解决方案4】:

你甚至不需要 numpy 或 scipy...

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

【讨论】:

  • 然后 mean([2,3]) 会给出 2。小心浮动。最好使用 float(sum(l))/len(l)。更好的是,小心检查列表是否为空。
  • @jesusiniesta 除了在 python3 中,除法做它打算做的事情:除法
  • 如果你在程序顶部 from __future__ import division 在 Python 2.2+ 中
  • 大数字和溢出怎么办?
  • a = list() 怎么样?建议的代码结果为ZeroDivisionError
【解决方案5】:

使用 scipy:

import scipy;
a=[1,2,4];
print(scipy.mean(a));
【解决方案6】:

您可以执行以下操作,而不是强制浮动

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 添加到 statistics 模块。哪个更快并且总是返回浮点数。

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

这比 mean() 函数运行得更快,它总是返回一个 漂浮。数据可以是序列或可迭代的。如果输入数据集是 为空,引发 StatisticsError。

fmean([3.5, 4.0, 5.25])

4.25

3.8 版中的新功能。

【讨论】:

    【解决方案7】:
    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
    

    【讨论】:

      【解决方案8】:

      如果您使用的是 python >= 3.8,则可以使用标准库中 statistics 模块中引入的 fmean 函数:

      >>> from statistics import fmean
      >>> fmean([0, 1, 2, 3])
      1.5
      

      它比statistics.mean 函数更快,但它预先将其数据点转换为float,因此在某些特定情况下它可能不太准确。

      你可以看到它的实现here

      【讨论】:

        【解决方案9】:
        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
        

        【讨论】:

          【解决方案10】:
          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)
          

          【讨论】:

            【解决方案11】:

            我一直认为 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)
              

            【讨论】:

              【解决方案12】:

              您的问题的正确答案是使用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)))
              

              【讨论】:

                【解决方案13】:

                其他人已经发布了非常好的答案,但有些人可能仍在寻找一种经典的方法来找到平均值(平均),所以我在这里发布这个(在 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
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2013-01-14
                  • 1970-01-01
                  • 2012-06-19
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多