I am learning numpy and am a bit confused about broadcasting, here is my set up. I have two matrices
>>> y=np.array([1,2,3])
>>> v = np.array([1,2,3])
>>> r=np.reshape(v, (3, 1))
So r is (3*1) matrix while y is a rank 1 matrix with shape being(3,).
If I do y.dot(r), I get 14, assuming that numpy applies broadcasting on y, making it (1*3) and then it does the dot product with r(3*1) so resulting matrix will be 1*1.
However when I do r.dot(y), it throws an error. Why doesn't it do the same thing here? It should make y(1*3) and r being(3*1), it should give a 3*3 matrix. What is wrong with this reasoning?
The normal broadcasting does not apply in np.dot. It's docs say:
For N dimensions it is a sum product over the last axis of
aand the second-to-last ofb::
y is (3,); r is (3,1).
In y*r, broadcasting applies, y is reshaped to (1,3), and the result is (3,3).
In np.dot(y,r), the last axis of y is 3, 2nd last of r is also 3, multiply and sum, the shape is (1,). Note that if y starts as (1,3), the result is 2d:
In [445]: np.dot(y.reshape(1,3),r).shape
Out[445]: (1, 1)
In np.dot(r,y), last axis of r is 1, 2nd to last (only) of y is 3 - hence the mismatch.
Expanding y does produce the (3,3):
In [449]: np.dot(r,y.reshape(1,3))
Out[449]:
array([[1, 2, 3],
[2, 4, 6],
[3, 6, 9]])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With