2012-12-01 70 views
3

有没有一种简单的方法来计算Python中几个(相同长度)列表的平均值?说,我有[[1, 2, 3], [5, 6, 7]],并且想获得[3,4,5]。这是要做100000次,所以想要它快。Python:快速计算几个(相同长度)列表的平均值的方法?

+1

如何为第一个元素获得'4'? – NPE

+3

NumPy数组可能比纯Python更快。否则,除了这样做外,确实没有“快速”的方法。而10万次并不是真的那么多。 –

+0

@LennartRegebro:我刚刚做了一些基准测试,在这样一个小输入上'numpy.average()'比简单的列表理解速度慢了10倍。很令人惊讶。 – NPE

回答

3
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.124s。

有趣的是,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 

如果输入变得更大,所述相对时间无疑会变化。

+0

这是假设他有两个100000项目的列表,可以这样解释这个问题,但不知何故,我怀疑这是他想要的。 –

+0

@LennartRegebro:对我来说,*“这是做10万次“*意味着许多投入,而不是长时间投入,但是我们当然可以在OP上做出澄清。 – NPE

10

如果你使用numpy(这似乎是更合适的位置):

>>> import numpy as np 
>>> data = np.array([[1, 2, 3], [5, 6, 7]]) 
>>> np.average(data, axis=0) 
array([ 3., 4., 5.]) 
0

扩展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 x: x/len(l)的lambda,但使用显式函数并预先计算长度应该快一些。