# For broadcasting, can m by n by k matrix be multiplied with n by k matrix?

6 messages
Open this post in threaded view
|

## For broadcasting, can m by n by k matrix be multiplied with n by k matrix?

 Hello all,Can an m x n x k matrix be multiplied with n x k matrix? Looking at the Numpy doc page 46 (https://docs.scipy.org/doc/numpy-1.11.0/numpy-user-1.11.0.pdf), it should work.It says the following:A (3d array): 15 x 3 x 5B (2d array):         3 x 5Result (3d array): 15 x 3 x 5But, the rule did not work for me. Here's my toy example:>>> a = np.arange(3*4*5).reshape(3,4,5) >>> b = np.arange(4*5).reshape(4,5)>>> np.dot(a, b)Traceback (most recent call last):  File "", line 1, in ValueError: shapes (3,4,5) and (3,5) not aligned: 5 (dim 2) != 3 (dim 0)Am I miss reading something? Thank you in advance! _______________________________________________ NumPy-Discussion mailing list [hidden email] https://mail.python.org/mailman/listinfo/numpy-discussion
Open this post in threaded view
|

## Re: For broadcasting, can m by n by k matrix be multiplied with n by k matrix?

 On Sat, Apr 20, 2019 at 12:24 AM C W <[hidden email]> wrote: > > Am I miss reading something? Thank you in advance! Hey, You are missing that the broadcasting rules typically apply to arithmetic operations and methods that are specified explicitly to broadcast. There is no mention of broadcasting in the docs of np.dot [1], and its behaviour is a bit more complicated. Specifically for multidimensional arrays (which you have), the doc says If a is an N-D array and b is an M-D array (where M>=2), it is a sum product over the last axis of a and the second-to-last axis of b: dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m]) So your (3,4,5) @ (3,5) would want to collapse the 4-length axis of `a` with the 3-length axis of `b`; this won't work. If you want elementwise multiplication according to the broadcasting rules, just use `a * b`: >>> a = np.arange(3*4*5).reshape(3,4,5) ... b = np.arange(4*5).reshape(4,5) ... (a * b).shape (3, 4, 5) [1]: https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html_______________________________________________ NumPy-Discussion mailing list [hidden email] https://mail.python.org/mailman/listinfo/numpy-discussion
Open this post in threaded view
|

## Re: For broadcasting, can m by n by k matrix be multiplied with n by k matrix?

 Thanks, you are right. I overlooked it's for addition.The original problem was that I have matrix X (RBG image, 3 layers), and vector y. I wanted to do np(X, y.T).>>> X.shape   # 100 of 28 x 28 matrix(100, 28, 28)>>> y.shape   # Just one 28 x 28 matrix (1, 28, 28)But, np.dot() gives me four axis shown below,>>> z = np.dot(X, y.T)>>> z.shape(100, 28, 28, 1)The fourth axis is unexpected. Should y.shape be (28, 28), not (1, 28, 28)?Thanks again!On Fri, Apr 19, 2019 at 6:39 PM Andras Deak <[hidden email]> wrote:On Sat, Apr 20, 2019 at 12:24 AM C W <[hidden email]> wrote: > > Am I miss reading something? Thank you in advance! Hey, You are missing that the broadcasting rules typically apply to arithmetic operations and methods that are specified explicitly to broadcast. There is no mention of broadcasting in the docs of np.dot [1], and its behaviour is a bit more complicated. Specifically for multidimensional arrays (which you have), the doc says If a is an N-D array and b is an M-D array (where M>=2), it is a sum product over the last axis of a and the second-to-last axis of b: dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m]) So your (3,4,5) @ (3,5) would want to collapse the 4-length axis of `a` with the 3-length axis of `b`; this won't work. If you want elementwise multiplication according to the broadcasting rules, just use `a * b`: >>> a = np.arange(3*4*5).reshape(3,4,5) ... b = np.arange(4*5).reshape(4,5) ... (a * b).shape (3, 4, 5) [1]: https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html _______________________________________________ NumPy-Discussion mailing list [hidden email] https://mail.python.org/mailman/listinfo/numpy-discussion _______________________________________________ NumPy-Discussion mailing list [hidden email] https://mail.python.org/mailman/listinfo/numpy-discussion
Open this post in threaded view
|

## Re: For broadcasting, can m by n by k matrix be multiplied with n by k matrix?

 You may find np.einsum() more intuitive than np.dot() for aligning axes -- it's certainly more explicit.On Fri, Apr 19, 2019 at 3:59 PM C W <[hidden email]> wrote:Thanks, you are right. I overlooked it's for addition.The original problem was that I have matrix X (RBG image, 3 layers), and vector y. I wanted to do np(X, y.T).>>> X.shape   # 100 of 28 x 28 matrix(100, 28, 28)>>> y.shape   # Just one 28 x 28 matrix (1, 28, 28)But, np.dot() gives me four axis shown below,>>> z = np.dot(X, y.T)>>> z.shape(100, 28, 28, 1)The fourth axis is unexpected. Should y.shape be (28, 28), not (1, 28, 28)?Thanks again!On Fri, Apr 19, 2019 at 6:39 PM Andras Deak <[hidden email]> wrote:On Sat, Apr 20, 2019 at 12:24 AM C W <[hidden email]> wrote: > > Am I miss reading something? Thank you in advance! Hey, You are missing that the broadcasting rules typically apply to arithmetic operations and methods that are specified explicitly to broadcast. There is no mention of broadcasting in the docs of np.dot [1], and its behaviour is a bit more complicated. Specifically for multidimensional arrays (which you have), the doc says If a is an N-D array and b is an M-D array (where M>=2), it is a sum product over the last axis of a and the second-to-last axis of b: dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m]) So your (3,4,5) @ (3,5) would want to collapse the 4-length axis of `a` with the 3-length axis of `b`; this won't work. If you want elementwise multiplication according to the broadcasting rules, just use `a * b`: >>> a = np.arange(3*4*5).reshape(3,4,5) ... b = np.arange(4*5).reshape(4,5) ... (a * b).shape (3, 4, 5) [1]: https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html _______________________________________________ NumPy-Discussion mailing list [hidden email] https://mail.python.org/mailman/listinfo/numpy-discussion _______________________________________________ NumPy-Discussion mailing list [hidden email] https://mail.python.org/mailman/listinfo/numpy-discussion _______________________________________________ NumPy-Discussion mailing list [hidden email] https://mail.python.org/mailman/listinfo/numpy-discussion