web-dev-qa-db-ja.com

2D配列の次元全体の平均を計算する

次のような配列aがあります。

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

各ディメンションの平均を個別に計算する必要があります。結果は次のようになります。

[45, 10.5]

45a[*][0]の平均であり、10.5a[*][1]の平均です。

ループを使用せずにこれを解決する最もエレガントな方法は何ですか?

63
otmezger

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
97
askewchan

これは非numpyソリューションです:

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

これをたくさんやるなら、 NumPy が道です。

何らかの理由でNumPyを使用できない場合:

>>> map(lambda x:sum(x)/float(len(x)), Zip(*a))
[45.0, 10.5]
4
NPE