2016-08-12 6 views
0

私は以下の多次元配列を持っています。第1の軸は、3次元ベクトル を示す。私は それぞれについて、3行3列の行列x・x 'を計算したいと思います。ブロードバンドを使用してこのコードを高速化する方法は?

私の現在のソリューション:

arr.shape 
# (3, 64, 64, 33, 187) 

dm = arr.reshape(3,-1) 
dm.shape 
# (3, 25276416) 

cov = np.empty((3,3,dm.shape[1])) 
cov.shape 
# (3, 3, 25276416) 

このforループ反復する25276416すべての上の要素とその周辺1または2分かかります。

for i in range(dm.shape[1]): 
    cov[...,i] = dm[:,i].reshape(3,1).dot(dm[:,i].reshape(1,3)) 

cov = cov.reshape((3,) + arr.shape) 
cov.shape 
# (3, 3, 64, 64, 33, 187) 

答えて

1

さてあなたは本当にnp.dotを使用して、そのマトリックス乗算を持つ任意の軸を縮小していない、それはちょうどそこに要素単位の乗算を放送しています。

cov = arr[:,None]*arr 
- そうのように、

cov = dm[:,None]*dm 

それともdmとすべてのこと整形を作成しないようにarrに直接それを使用する - だから、あなたは、単にそのように、全部のためNumPy broadcastingを使用することができます

関連する問題