有没有一种简单的方法在Python中计算多个(长度相同)列表的平均值?例如,我有[[1, 2, 3], [5, 6, 7]]
,想获取[3,4,5]
。需要进行100000次操作,因此希望速度快。
有没有一种简单的方法在Python中计算多个(长度相同)列表的平均值?例如,我有[[1, 2, 3], [5, 6, 7]]
,想获取[3,4,5]
。需要进行100000次操作,因此希望速度快。
如果您使用 numpy
(在这种情况下似乎更合适):
>>> import numpy as np
>>> data = np.array([[1, 2, 3], [5, 6, 7]])
>>> np.average(data, axis=0)
array([ 3., 4., 5.])
In [6]: l = [[1, 2, 3], [5, 6, 7]]
In [7]: [(x+y)/2 for x,y in zip(*l)]
Out[7]: [3, 4, 5]
您需要决定是使用整数还是浮点数进行数学计算,并选择要使用的除法类型。
在我的计算机上,以上操作需要1.24微秒:
In [11]: %timeit [(x+y)/2 for x,y in zip(*l)]
1000000 loops, best of 3: 1.24 us per loop
因此,处理 100,000 个输入需要 0.124 秒。
有趣的是,在这样小的输入上,NumPy 数组比较慢:
In [27]: In [21]: a = np.array(l)
In [28]: %timeit (a[0] + a[1]) / 2
100000 loops, best of 3: 5.3 us per loop
In [29]: %timeit np.average(a, axis=0)
100000 loops, best of 3: 12.7 us per loop
如果输入变得更大,相关的时间肯定会改变。
n
个子列表且想要求平均值的列表,请使用以下代码(numpy解决方案可能更快,但我的方法仅使用内置函数):def average(l):
llen = len(l)
def divide(x): return x / llen
return map(divide, map(sum, zip(*l)))
len
计算内联,并将divide
转换为lambda表达式,如lambda x: x / len(l)
,但使用显式函数并预先计算长度应该会更快一些。稍作修改以便与RGB像素平稳工作的版本:
def average(*l):
l=tuple(l)
def divide(x): return x // len(l)
return list(map(divide, map(sum, zip(*l))))
print(average([0,20,200],[100,40,100]))
>>> [50,30,150]
4
? - NPEnumpy.average()
比简单的列表推导式慢10倍。相当令人惊讶。 - NPE