Reputation: 10794
I have an array a
like this:
a = [[40, 10], [50, 11]]
I need to calculate the mean for each dimension separately, the result should be this:
[45, 10.5]
45
being the mean of a[*][0]
and 10.5
the mean of a[*][1]
.
What is the most elegant way of solving this without using a loop?
Upvotes: 104
Views: 214441
Reputation: 208645
Here is a non-numpy solution:
>>> a = [[40, 10], [50, 11]]
>>> [float(sum(l))/len(l) for l in zip(*a)]
[45.0, 10.5]
Upvotes: 16
Reputation: 500873
If you do this a lot, NumPy is the way to go.
If for some reason you can't use NumPy:
>>> map(lambda x:sum(x)/float(len(x)), zip(*a))
[45.0, 10.5]
Upvotes: 6
Reputation: 46578
a.mean()
takes an axis
argument:
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])
Or, as a standalone function:
In [5]: np.mean(a, axis=1)
Out[5]: array([ 25. , 30.5])
The reason your slicing wasn't working is because this is the syntax for slicing:
In [6]: a[:,0].mean() # first column
Out[6]: 45.0
In [7]: a[:,1].mean() # second column
Out[7]: 10.5
Upvotes: 161