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
を生成するときに、より面白くなります。それは、このようa
とb
見するのを助けることができる
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以上になります。私は名前よりも形にもっと注意を払う。
aを(3,1)に、bを(2,1)に再構成した場合。すると、a * b.Tは(3,2)になります。 'a * b.T〜=(3,1)*(1,2)'です。内側の寸法が一致します。したがって、結果の行列は外の次元3と2になります。したがって、(3,2) – nikpod
私はあなたが意味することを知っていますが、使用すると、配列についての要素ごとの乗算を意味します。たとえば、c(配列タイプ)の形状が(2,3)* d(配列タイプ)の場合は形状が(3,2)が間違っていて形状が違うので@nikpod –