4

私はnumpyを学んでいて、ブロードキャストについて少し混乱しています.これが私のセットアップです. 私は2つの行列を持っています

>>> y=np.array([1,2,3])
>>> v = np.array([1,2,3])
>>> r=np.reshape(v, (3, 1))

したがって、r は (3*1) 行列であり、y は形状が (3,) であるランク 1 の行列です。

y.dot(r) を実行すると、14 が得られます。numpy が y にブロードキャストを適用すると仮定すると、(1*3) になり、r(3*1) でドット積を実行するため、結果の行列は 1* になります。 1.

ただし、r.dot(y) を実行すると、エラーがスローされます。ここで同じことをしないのはなぜですか?y(1*3) と r を (3*1) にする必要があり、3*3 行列を与える必要があります。この推論のどこが間違っているのでしょうか?

4

2 に答える 2

5

では通常放送は適用されませんnp.dot。ドキュメントは次のように述べています。

N 次元の場合、 ::の最後の軸aと最後から 2 番目の軸の積の合計です。b

yです(3,)rです(3,1)

ではy*r、ブロードキャストが適用され、yに整形され(1,3)、結果は になり(3,3)ます。

ではnp.dot(y,r)、 の最後の軸はy3、 の 2 番目の最後の軸r3です(1,)yとして開始する場合(1,3)、結果は 2d になることに注意してください。

In [445]: np.dot(y.reshape(1,3),r).shape
Out[445]: (1, 1)

ではnp.dot(r,y)、 の最後の軸は で、 の最後rから12 番目 (のみ) ですy3したがって、不一致です。

展開すると、次yのものが生成されます(3,3)

In [449]: np.dot(r,y.reshape(1,3))
Out[449]: 
array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])
于 2015-07-12T15:28:01.980 に答える