2012-12-01 108 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,但使用顯式函數並預先計算長度應該快一些。