I'm having some trouble understanding the rules for array broadcasting in Numpy.
Obviously, if you perform element-wise multiplication on two arrays of the same dimensions and shape, everything is fine. Also, if you multiply a multi-dimensional array by a scalar it works. This I understand.
But if you have two N-dimensional arrays of different shapes, it's unclear to me exactly what the broadcasting rules are. This documentation/tutorial explains that: In order to broadcast, the size of the trailing axes for both arrays in an operation must either be the same size or one of them must be one.
Okay, so I assume by trailing axis they are referring to the N
in a M x N
array. So, that means if I attempt to multiply two 2D arrays (matrices) with equal number of columns, it should work? Except it doesn't...
>>> from numpy import *
>>> A = array([[1,2],[3,4]])
>>> B = array([[2,3],[4,6],[6,9],[8,12]])
>>> print(A)
[[1 2]
[3 4]]
>>> print(B)
[[ 2 3]
[ 4 6]
[ 6 9]
[ 8 12]]
>>>
>>> A * B
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape
Since both A
and B
have two columns, I would have thought this would work. So, I'm probably misunderstanding something here about the term "trailing axis", and how it applies to N-dimensional arrays.
Can someone explain why my example doesn't work, and what is meant by "trailing axis"?
From http://cs231n.github.io/python-numpy-tutorial/#numpy-broadcasting:
Well, the meaning of trailing axes is explained on the linked documentation page. If you have two arrays with different dimensions number, say one
1x2x3
and other2x3
, then you compare only the trailing common dimensions, in this case2x3
. But if both your arrays are two-dimensional, then their corresponding sizes have to be either equal or one of them has to be1
. Dimensions along which the array has size1
are called singular, and the array can be broadcasted along them.In your case you have a
2x2
and4x2
and4 != 2
and neither4
or2
equals1
, so this doesn't work.