2017-01-26 6 views
5

私はL、M、Nが小さく、Kが大きい数であるA(KxMxN)とB(KxLxN)の行列を持っているとしましょう。私は行列C(KxMxL)を得るために第1次元に沿って最後の2次元を使用する外積を計算したいと思います。効率的にnumpyで行列の2つの系列の外積を計算するには?

私は「K」の各インデックスKのためにforループを実行して、これを行うと2Dは、私はforループをせずにそれを行うことができる場合、私は疑問に思う

out = [np.matmul(x,y.T) for x, y in zip(A, B)] 
out=np.asarray(out) 

行列のためにnumpyののMATMUL機能を使用することができます/ Kとしての理解は非常に大きな数です。

+0

これは実際にはサブアレイのセットに内在する製品です。外付け製品は寸法を増やし、総計はしません。 – hpaulj

答えて

5

A(K, M, N)B(K, L, N)を形作るあり、そしてあなたがシェイプ(K, M, L)との積の和を見つけたい、あなたはnp.einsum使用できる形があるので:そうBで転置と

C = np.einsum('kmn,kln->kml', A, B) 
0

matmul作品を、最後の2分の1から2番目の間違いは、Aの最後に一致します。

In [1019]: A=np.random.rand(K,M,N) 
In [1021]: B=np.random.rand(K,L,N) 

In [1023]: C=np.einsum('kmn,kln->kml',A,B) 
In [1024]: C.shape 
Out[1024]: (2, 4, 3) 

In [1026]: [email protected](0,2,1) 
In [1027]: D.shape 
Out[1027]: (2, 4, 3) 

In [1028]: np.allclose(C,D) 
Out[1028]: True 

この小さな例では、timeitは同じです。

[np.dot(x,y.T) for x, y in zip(A, B)]同じことを行います。最後の2つ目のyxのものと一致させて、ABの1番目のぼかしで繰り返します。

関連する問題