在Python中是否有内置的或标准库方法可以计算数字列表的算术平均数(一种平均数)?
在Python中是否有内置的或标准库方法可以计算数字列表的算术平均数(一种平均数)?
我不知道标准库中是否有相关内容。但是,你可以使用类似以下的东西:
def mean(numbers):
return float(sum(numbers)) / max(len(numbers), 1)
>>> mean([1,2,3,4])
2.5
>>> mean([])
0.0
numpy.mean()
函数。[]
的平均值为0
,可以通过float(sum(l))/max(len(l),1)
来实现。 - yo'l
是一个糟糕的变量名,因为它看起来太像1
。此外,我会使用if l
而不是if len(l) > 0
。可以参考这里:https://dev59.com/o3VD5IYBdhLWcg3wNIvc - zondofloat
。此外,在我看来,对于空列表,引发ZeroDivisionError
是有意义的,而不是返回0。通过这些更改,代码将变为:return sum(numbers) / len(numbers)
。 - Solomon UckoNumPy拥有一个算术平均的函数numpy.mean
。使用起来非常简单:
>>> import numpy
>>> a = [1, 2, 4]
>>> numpy.mean(a)
2.3333333333333335
使用 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
运算符实现特别精确,详见 PEP 和 Code。不确定 statistics._sum
和 numpy.sum
之间性能差异巨大的原因。 - Eike P.statistics.mean
试图让结果正确。它正确计算了[1e50, 1, -1e50] * 1000
的平均值。 - Antti Haapala -- Слава Україніstatistics.mean
也可以接受一个值的生成器表达式,而所有使用 len()
作为除数的解决方案都会卡住。 - PaulMcGstatistics.fmean
函数。 - Mathieu Rollet您甚至不需要使用numpy或scipy...
>>> a = [1, 2, 3, 4, 5, 6]
>>> print(sum(a) / len(a))
3
from __future__ import division
,则可以实现: - spiffytecha = list()
怎么样?建议的代码会导致ZeroDivisionError
错误。 - 0 _使用Scipy:
import scipy;
a=[1,2,4];
print(scipy.mean(a));
不必将其转换为浮点数,您可以采取以下措施
def mean(nums):
return sum(nums, 0.0) / len(nums)
mean = lambda nums: sum(nums, 0.0) / len(nums)
更新:2019-12-15
Python 3.8在 statistics 模块中添加了函数 fmean,它比 mean() 函数更快并且始终返回浮点数。
将数据转换为浮点型并计算算术平均值。
该函数比 mean() 函数运行更快,并且它始终返回浮点数。数据可以是一个 sequence 或 iterable。如果输入的数据集为空,则会引发 StatisticsError 异常。
fmean([3.5, 4.0, 5.25])
4.25
在版本 3.8 中新增。
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
statistics.mean
。但为了好玩,这里有一个版本的均值不使用len()
函数,因此它(像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)))
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