When you use the + operator with a NumPy array and a tuple, NumPy implicitly converts the tuple into an ndarray and then applies its broadcasting rules. In your example, instead of adding b (which is a NumPy array) to a, you inadvertently add the tuple b.shape (i.e. (3,)) to a.
Here's what typically happens,
When you do a + b.shape
, NumPy internally converts the tuple (3,) to an ndarray using something similar to np.asarray(b.shape)
. This gives you an array with a single element, effectively array()
.
The resulting array is broadcast to match the shape of a
(which is (4,3)). The broadcasting process treats array()
as if it had shape (1,1), so it is expanded to (4,3), and every element in a
gets 3 added to it.
Finally,
This is why you observe that each element in a
increases by 3, resulting in an array where every entry is a[i][j] + 3
.
Pretty much, NumPy's ufunc mechanism automatically handles non-ndarray operands by converting them and applying its standard broadcasting rules.