2017-06-21 3 views
0

程度使用*は、私が2つのnumpyの配列があります。私はa*b.Tを使用する場合は、その形状に違いがあるのでnumpy.arrayとnumpy.matrix

a = np.array([1, 2, 3]).reshape(3, 1) 
b = np.array([4, 5]).reshape(2,1) 

、私は*行いを使用して(間違った出力を考えていますが配列に対する要素ごとの乗算)。 しかし、結果はこのように、行列の乗算を返します。

[[ 4, 5], 
[ 8, 10], 
[12, 15]] 

# this shape is (3, 2) 

なぜそれがこのように動作しますか?

+1

aを(3,1)に、bを(2,1)に再構成した場合。すると、a * b.Tは(3,2)になります。 'a * b.T〜=(3,1)*(1,2)'です。内側の寸法が一致します。したがって、結果の行列は外の次元3と2になります。したがって、(3,2) – nikpod

+0

私はあなたが意味することを知っていますが、使用すると、配列についての要素ごとの乗算を意味します。たとえば、c(配列タイプ)の形状が(2,3)* d(配列タイプ)の場合は形状が(3,2)が間違っていて形状が違うので@nikpod –

答えて

1

a * b.Tは要素乗算であり、broadcastingのために機能します。加算、および他の多くのバイナリ演算は、この一対の形状で動作します。

aは(3,1)である。 b.Tは(1,2)です。ブロードキャストは、(3,1)を(1,2)と組み合わせて(3,2)を生成する。サイズ1のディメンションは、他の非ゼロのディメンションと一致するように調整されます。

で配列を作成しない限り、*は数学的にmatrix multiplicationを実行しません。 np.dotがこれを実行するために使用されます(@およびnp.einsumも同様です)。

この特定の形状の組み合わせでは、dot製品は同じです。 np.outer(a,b)もこれを生成し、数学的にはouter productとなります。 np.dotは、aの最後のディメンションと一致し、最後のディメンションの2番目のディメンションはb.Tです。この場合、それらは両方とも1. dotは、共有ディメンションに複数のアイテムがある場合に、おなじみのsum of productsを生成するときに、より面白くなります。それは、このようab見するのを助けることができる

In [3]: a + b.T 
Out[3]: 
array([[5, 6], 
     [6, 7], 
     [7, 8]]) 

In [5]: np.dot(a, b.T) 
Out[5]: 
array([[ 4, 5], 
     [ 8, 10], 
     [12, 15]]) 

'外' ほか

In [7]: a 
Out[7]: 
array([[1], 
     [2], 
     [3]]) 
In [8]: b 
Out[8]: 
array([[4], 
     [5]]) 
In [9]: b.T 
Out[9]: array([[4, 5]]) 

私は、一般的に約numpyアレイの話をするmatrixを使用していませんnp.matrix、またはより頻繁にはscipy.sparseで作成されている場合を除きます。 numpy配列は0d、1d、2d以上になります。私は名前よりも形にもっと注意を払う。

+0

ちょうど私が考えたものドキュメントから放送がOPがその出力を得る理由です。 – nikpod

+0

非常に良い、ありがとう –

関連する問題