2013-07-01 10 views
13

numpyには、複数の軸に渡って平均を計算する速い方法がありますか?私は、n次元配列の0軸以外のすべての平均を計算しています。numpy配列の複数軸の平均を取得する

私は現在これを行っています。

for i in range(d.ndim - 1): 
    d = d.mean(axis=1) 

私はPythonループを使用しないソリューションがあるのだろうかと思います。

答えて

8

私のアプローチは、すべての高次元を平坦にして、軸1で平均を実行することです。これはあなたの探しているものですか?

In [14]: x = np.array([[[1,2],[3,4]],[[5,6],[7,8]]]) 

In [16]: x.reshape((x.shape[0], -1)).mean(axis=1) 
Out[16]: array([ 2.5, 6.5]) 

(ステップ2は、単に高い暗くなるの長さの積を計算)

+2

ありがとう!また、higher_dimsの代わりに-1を使用することもできます。 – dsg101

+0

@ dsg101素晴らしい!今すぐ編集! – acjay

0

の@ dsg101の提案に続き、これはあなたが望むものの一種でありますか? numpyの1.7では

>>> import numpy as np 
>>> d=np.reshape(np.arange(5*4*3),[5,4,3]) 
>>> d 
array([[[ 0, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8], 
     [ 9, 10, 11]], 

     [[12, 13, 14], 
     [15, 16, 17], 
     [18, 19, 20], 
     [21, 22, 23]], 

     [[24, 25, 26], 
     [27, 28, 29], 
     [30, 31, 32], 
     [33, 34, 35]], 

     [[36, 37, 38], 
     [39, 40, 41], 
     [42, 43, 44], 
     [45, 46, 47]], 

     [[48, 49, 50], 
     [51, 52, 53], 
     [54, 55, 56], 
     [57, 58, 59]]]) 
>>> np.mean(np.reshape(d,[d.shape[0],np.product(d.shape[1:])]),axis=1) 
array([ 5.5, 17.5, 29.5, 41.5, 53.5]) 
+0

はい、私はこれがOPの解決よりも速いと思います。 – dsg101

+0

'np.product(d.shape [1:])'のほうが賢明です。 '-1' – Eric

25

あなたはnp.meanに複数の軸を与えることができます:

d.mean(axis=tuple(range(1, d.ndim))) 

私はすべての次元を平らにするために、配列を再形成するのコピーをトリガしない限り、これは、他のソリューション提案と同様に実行されます推測していますこの場合、これははるかに高速でなければなりません。だからこれはおそらくより一貫したパフォーマンスを提供するだろう。

+0

優秀!私は現在numpy 1.6になっています。 – dsg101

+0

バージョン1.7.1またはバージョン1.8.2のnumpyではこの機能が存在しないことを確認できません。嬉しい考えですか? – j08lue

+0

試しましたが、うまくいきませんでしたか?それは1.7であった、私を信頼してください。すべてのufuncに変更が加えられたので、 'np.madd'のように' np.add'に依存するすべての関数に自動的に伝播しました。これを修正するための[公開PR](https://github.com/numpy/numpy/pull/5146)があるにもかかわらず、「平均」やその他の同様の機能のドキュメントには追加されませんでした。しかし、あなたは[np.sum'の文書(https://github.com/numpy/numpy/pull/5146)を見て、バージョン1.7で* Newとタグ付けされた関連する変更を見てみることができます。 0. * – Jaime

3

またnumpy.apply_over_axesを使用することができます。

import numpy as np 

x = np.array([[[1,2],[3,4]],[[5,6],[7,8]]]) 
y = np.apply_over_axes(np.mean, x, (1, 2)) 
y = array([[[ 2.5]],[[ 6.5]]]) 
関連する問題