2017-02-18 15 views
1

私はA X Bアレイと別のD X A X A配列を持っているとD軸に沿って2つの配列のドット積の和を計算するために効率的な方法を思い付くしようとしています(結果はA x Bアレイになるように)。最も明白な方法は、forループを使用することです:numpyの - 軸に沿って、ドット積の合計

result = np.zeros(first_array.shape) 
for d in range(0,second_array.shape[0]): 
    result = result + np.dot(second_array[d], first_array) 
print result 

numpyの中でこれを計算するより効率的な方法がある場合、私は思ったんだけど。私はnp.einsumに少し読んだことがありますが、残念なことに、この場合に役立つかどうかは完全に理解していません。

答えて

3
In [436]: np.einsum('ijk,km->jm',np.ones((2,3,3)),np.ones((3,4))) 
Out[436]: 
array([[ 6., 6., 6., 6.], 
     [ 6., 6., 6., 6.], 
     [ 6., 6., 6., 6.]]) 
In [437]: _.shape 
Out[437]: (3, 4) 

あなたdotは(kが第2の最後の第1及び第2の最後の間で共有される)のように表される:最初の配列は、その3次元形状に一致するi追加

In [438]: np.einsum('jk,km->jm',np.ones((3,3)),np.ones((3,4))) 
Out[438]: 
array([[ 3., 3., 3., 3.], 
     [ 3., 3., 3., 3.], 
     [ 3., 3., 3., 3.]]) 

。しかし、resultからそれを省略すると、einsumにその値を合計するよう指示されます。合計なし。

In [439]: np.einsum('ijk,km->ijm',np.ones((2,3,3)),np.ones((3,4))).shape 
Out[439]: (2, 3, 4) 
関連する問題