2016-08-15 3 views
2

私は、ブロック行列(またはより一般的には、d-dim nd.array)の簡単な計算を行いたいと思います。このような何か:絵でnumpyのブロック行列の平均/総和を取る最良の方法は?

Block matrix

、大文字は、3×3ブロック行列を表し、小文字、数字(平均値またはブロック行列の和)です。

現在、私は唯一のループ

import numpy as np 

test_matrix = np.arange(81).reshape(9,9) 
a = np.zeros((3,3)) 
for i in range(3): 
    for j in range(3): 
     a[k,i,j] = test_matrix[3*i:3*(i+1),3*j:3*(j+1)].mean() 
print a 

のために使用してこれを行う方法を知っている。しかし、私の行列は次のような、より大きなまたは多次元得れば、それは遅くなる:

test_matrix = np.arange(81*2).reshape(2,9,9) 

a = np.zeros((2,3,3)) 
for k in range(2): 
    for i in range(3): 
     for j in range(3): 
      a[k,i,j] = test_matrix[k,3*i:3*(i+1),3*j:3*(j+1)].mean() 
print a 

この種のタスクを実行するためのより良い方法はありますか?

ありがとうございます!

リシェイプと和または選択した軸上意味で
+0

(3,3,3,3)に変形して、2つの軸を合計します。 – hpaulj

答えて

3
In [1952]: test=np.arange(81).reshape(9,9) 
In [1953]: res=np.zeros((3,3)) 
In [1954]: for i in range(3): 
     ...:  for j in range(3): 
     ...:   res[i,j]=test[3*i:3*(i+1),3*j:3*(j+1)].mean() 
In [1955]: res 
Out[1955]: 
array([[ 10., 13., 16.], 
     [ 37., 40., 43.], 
     [ 64., 67., 70.]]) 

In [1956]: test.reshape(3,3,3,3).mean(axis=(1,3)) 
Out[1956]: 
array([[ 10., 13., 16.], 
     [ 37., 40., 43.], 
     [ 64., 67., 70.]]) 

合計/平均は私たちが一度に2つ以上の軸を指定することができますが、それはまた繰り返し単軸アプリケーションで行うことができます。 3Dアレイについて

test.reshape(3,3,3,3).mean(3).mean(1) 

test.reshape(2,3,3,3,3).mean((2,4)) 
test.reshape(-1,3,3,3,3).mean((2,4)) 

これらの作業は-1元の第1の寸法を維持(または2D testの場合には、サイズ1次元を追加)。

+0

ありがとうhpaulj!あなたのアドバイスに従って、次のようにしてください: 'test_matrix.reshape(2,3,3,9).mean(2).reshape(2,9,3).mean(2).reshape(2,3,3) '(3次元の場合) – skippyho

関連する問題