2013-04-04 66 views
43

我有一个这样的阵列a横跨尺寸意味着:计算在2D阵列

a = [[40, 10], [50, 11]] 

我需要分别计算平均每个维度,结果应该是这样的:

[45,10.5] 

45是“a [*] [1]”的均值a[*][0]10.5的均值。

什么是解决这个问题的最优雅的方式,而不是一个循环?

回答

63

a.mean()需要一个axis参数:

In [1]: import numpy as np 

In [2]: a = np.array([[40, 10], [50, 11]]) 

In [3]: a.mean(axis=1)  # to take the mean of each row 
Out[3]: array([ 25. , 30.5]) 

In [4]: a.mean(axis=0)  # to take the mean of each col 
Out[4]: array([ 45. , 10.5]) 

或者,作为一个独立的功能:

In [5]: np.mean(a, axis=1) 
Out[5]: array([ 25. , 30.5]) 

您的切片是不工作的原因是因为这是切片的语法:

In [6]: a[:,0].mean() # first column 
Out[6]: 45.0 

In [7]: a[:,1].mean() # second column 
Out[7]: 10.5 
+0

感谢您的快速反应。 'In [n]:'是什么意思?代码的这一部分? – otmezger 2013-04-04 19:31:35

+0

这是因为我使用[IPython](http://ipython.org/)。 – askewchan 2013-04-04 19:32:10

+0

我使用numpy,所以第2行和第3行很好,但是用'axis = 0'而不是'axis = 1' – otmezger 2013-04-04 19:32:16

3

如果你做了很多,NumPy是要走的路。

如果由于某种原因,你不能使用NumPy的:

>>> map(lambda x:sum(x)/float(len(x)), zip(*a)) 
[45.0, 10.5] 
7

这里是一个非numpy的解决方案:

>>> a = [[40, 10], [50, 11]] 
>>> [float(sum(l))/len(l) for l in zip(*a)] 
[45.0, 10.5]