有没有一种简单的方法来计算 Python 中几个(相同长度)列表的平均值?说,我有[[1, 2, 3], [5, 6, 7]]
,并且想要获得[3,4,5]
。这是要做100000次,所以希望它快。
问问题
24396 次
4 回答
27
如果您正在使用numpy
(这里似乎更合适):
>>> import numpy as np
>>> data = np.array([[1, 2, 3], [5, 6, 7]])
>>> np.average(data, axis=0)
array([ 3., 4., 5.])
于 2012-12-01T17:21:21.200 回答
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.24us:
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
如果输入变大,相对时间无疑会改变。
于 2012-12-01T17:15:26.277 回答
2
扩展 NPE 的答案,对于包含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)
,但使用显式函数并预先计算长度应该会快一些。
于 2012-12-01T17:29:20.407 回答
0
略微修改的版本,可顺利处理 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]
于 2021-09-02T20:16:21.380 回答