如何在Python中计算列表的平均值?
[1, 2, 3, 4] ⟶ 2.5
对于Python 3.8+,使用statistics.fmean
来保证在使用浮点数时具有数值稳定性。(速度更快)
对于Python 3.4+,使用statistics.mean
来保证在使用浮点数时具有数值稳定性。(速度较慢)
xs = [15, 18, 2, 36, 12, 78, 5, 6, 9]
import statistics
statistics.mean(xs) # = 20.11111111111111
对于较旧的Python 3版本,请使用
sum(xs) / len(xs)
对于Python 2,将len
转换为浮点数以获得浮点除法:
sum(xs) / float(len(xs))
xs = [15, 18, 2, 36, 12, 78, 5, 6, 9]
sum(xs) / len(xs)
float('%.2f' % float(sum(l) / len(l)))
。 - Steinfeldround(result, 2)
以更简洁的方式实现相同的效果。 - ypreznumpy.mean
:xs = [15, 18, 2, 36, 12, 78, 5, 6, 9]
import numpy as np
print(np.mean(xs))
np.array(l).mean()
更快。 - L. Amber O'Hearnnp.mean(l)
和np.array(l).mean()
的速度差不多,而sum(l)/len(l)
的速度大约是它们的两倍。我使用的是l = list(np.random.rand(1000))
,当然如果l
是numpy.array
,那么两种numpy
方法的速度都会更快。 - Akavallnp.nanmean(l)
来避免在计算时出现 NAN 和 零除 的问题。 - Eliasstatistics.StatisticsError: mean requires at least one data point
,而不是使用sum(x) / len(x)
解决方案时出现更加晦涩的ZeroDivisionError: division by zero
。 - user3064538Python已经有完全可用的sum()
函数了,为什么要使用reduce()
呢?
print sum(l) / float(len(l))
(在Python 2中,float()
是必要的,可以强制Python进行浮点数除法。)
float()
。 - user3064538如果您使用的是Python >= 3.4版本,则有一个统计库可用。
https://docs.python.org/3/library/statistics.html
您可以像这样使用它的mean方法。假设您有一个数字列表,想要找到平均值:
list = [11, 13, 12, 15, 17]
import statistics as s
s.mean(list)
它还有其他方法,如stdev、variance、mode、harmonic mean、median等,这些方法也非常有用。
不需要将数值强制转换为浮点型,只需将0.0加入到总和中:
def avg(l):
return sum(l, 0.0) / len(l)
编辑:
我添加了另外两种获取列表平均值的方法(仅适用于Python 3.8+)。这是我所做的比较:
import timeit
import statistics
import numpy as np
from functools import reduce
import pandas as pd
import math
LIST_RANGE = 10
NUMBERS_OF_TIMES_TO_TEST = 10000
l = list(range(LIST_RANGE))
def mean1():
return statistics.mean(l)
def mean2():
return sum(l) / len(l)
def mean3():
return np.mean(l)
def mean4():
return np.array(l).mean()
def mean5():
return reduce(lambda x, y: x + y / float(len(l)), l, 0)
def mean6():
return pd.Series(l).mean()
def mean7():
return statistics.fmean(l)
def mean8():
return math.fsum(l) / len(l)
for func in [mean1, mean2, mean3, mean4, mean5, mean6, mean7, mean8 ]:
print(f"{func.__name__} took: ", timeit.timeit(stmt=func, number=NUMBERS_OF_TIMES_TO_TEST))
这是我得到的结果:
mean1 took: 0.09751558300000002
mean2 took: 0.005496791999999973
mean3 took: 0.07754683299999998
mean4 took: 0.055743208000000044
mean5 took: 0.018134082999999968
mean6 took: 0.6663848750000001
mean7 took: 0.004305374999999945
mean8 took: 0.003203333000000086
有趣!看起来 math.fsum(l) / len(l)
是最快的方法,然后是 statistics.fmean(l)
,最后才是 sum(l) / len(l)
。很好!
感谢 @Asclepius 向我展示这两种其他方法!
旧答案:
就效率和速度而言,这些是我测试其他答案得到的结果:
# test mean caculation
import timeit
import statistics
import numpy as np
from functools import reduce
import pandas as pd
LIST_RANGE = 10
NUMBERS_OF_TIMES_TO_TEST = 10000
l = list(range(LIST_RANGE))
def mean1():
return statistics.mean(l)
def mean2():
return sum(l) / len(l)
def mean3():
return np.mean(l)
def mean4():
return np.array(l).mean()
def mean5():
return reduce(lambda x, y: x + y / float(len(l)), l, 0)
def mean6():
return pd.Series(l).mean()
for func in [mean1, mean2, mean3, mean4, mean5, mean6]:
print(f"{func.__name__} took: ", timeit.timeit(stmt=func, number=NUMBERS_OF_TIMES_TO_TEST))
结果如下:
mean1 took: 0.17030245899968577
mean2 took: 0.002183011999932205
mean3 took: 0.09744236000005913
mean4 took: 0.07070840100004716
mean5 took: 0.022754742999950395
mean6 took: 1.6689282460001778
显然,获胜者是:
sum(l) / len(l)
np.array
,然后使用np.mean
函数,速度大约为0.16秒,比sum(l)/len(l)
快6倍。结论是:如果你要进行大量的计算,最好全部使用numpy来完成。 - drevickomean4
,这是我在那里做的... 我猜它已经是一个 np.array,那么使用 np.mean
就有意义了,但如果你有一个列表,那么你应该使用 sum(l) / len(l)
。 - Alon Gouldmansum(l) / float(len(l))
是正确答案,但为了完备性,你也可以使用单个reduce函数来计算平均值:
>>> reduce(lambda x, y: x + y / float(len(l)), l, 0)
20.111111111111114
注意,这可能会导致轻微的舍入误差:
>>> sum(l) / float(len(l))
20.111111111111111
reduce()
函数的最后一个参数中,将 0 替换为 False。这将使空列表返回 False,否则会像以前一样返回平均值。 - Andrew Clarkfloat
来计算 len
? - EndermanAPMfrom statistics import mean
n = [11, 13, 15, 17, 19]
print(n)
print(mean(n))
曾经使用过 Python 3.5
sum(L) / float(len(L))
的意思是计算列表 L 的平均值。在调用代码中处理空列表,可以使用if not L: ...
来判断。 - n611x007