What is broadcasting?
Broadcasting is NumPy's ability to perform operations on arrays with different shapes by automatically expanding (virtually) smaller arrays.
This is a major reason NumPy code is concise and fast. Nothing is actually copied in memory — NumPy just repeats the smaller array's values as if it were stretched to fit, without allocating that extra memory.
Simple example: add scalar
import numpy as np
arr = np.array([1, 2, 3])
print(arr + 10) # [11 12 13]Here, the scalar 10 is broadcast to match the shape (3,).
Example: add vector to matrix
import numpy as np
mat = np.array([
[1, 2, 3],
[4, 5, 6]
])
vec = np.array([10, 20, 30])
print(mat + vec)vec (shape (3,)) broadcasts across each row.
Broadcasting rules (must know)
When operating on two arrays, NumPy compares shapes from the trailing dimension (rightmost first) and works backward.
Two dimensions are compatible when:
- They are equal, OR
- One of them is
1
If dimensions are incompatible → broadcasting error.
Example: column vector + matrix
import numpy as np
mat = np.array([
[1, 2, 3],
[4, 5, 6]
])
col = np.array([100, 200]).reshape(2, 1)
print(mat + col)col has shape (2, 1) and broadcasts across columns.
Common broadcasting error
import numpy as np
mat = np.zeros((2, 3))
vec = np.array([1, 2])
# mat + vec -> ValueError (shapes (2,3) and (2,) not compatible)Fix by reshaping vec to a column vector if that's what you intend:
vec = vec.reshape(2, 1)
print(mat + vec)flowchart TD A["Compare shapes,
trailing axis first"] --> B{"Axis sizes equal
or one is 1?"} B -- "Yes, for every axis" --> C["Broadcast succeeds
virtually stretch the smaller array"] B -- "No, some axis mismatches" --> D["ValueError:
shapes not aligned"]
Why broadcasting is useful in analytics
- Normalize columns:
X / X.max(axis=0) - Center data:
X - X.mean(axis=0) - Apply weights:
X * weights
Check your understanding
In which order does NumPy compare shapes when broadcasting?
Broadcasting compares shapes starting at the last axis and works backward. Each pair of sizes must be equal or one must be 1.
Show answer
B — From the trailing dimension (rightmost first) backward — Broadcasting compares shapes starting at the last axis and works backward. Each pair of sizes must be equal or one must be 1.
mat has shape (2, 3) and vec has shape (3,). What is the shape of mat + vec?
The trailing axes match (3 and 3), so vec is virtually stretched across both rows and the result keeps shape (2, 3).
Show answer
B — (2, 3) — The trailing axes match (3 and 3), so vec is virtually stretched across both rows and the result keeps shape (2, 3).
mat has shape (2, 3) and vec = np.array([1, 2]) has shape (2,). How do you make mat + vec work as a per-row addition?
(2, 3) and (2,) clash on the trailing axis (3 vs 2). Reshaping vec to (2, 1) makes it a column that broadcasts across the columns. vec.T does nothing on a 1D array.
Show answer
A — Use vec.reshape(2, 1) — (2, 3) and (2,) clash on the trailing axis (3 vs 2). Reshaping vec to (2, 1) makes it a column that broadcasts across the columns. vec.T does nothing on a 1D array.
Which expression centers each column of X around zero, as shown in the lesson?
X.mean(axis=0) gives one mean per column, which broadcasts across all rows. X / X.max(axis=0) normalizes instead of centering.
Show answer
A — X - X.mean(axis=0) — X.mean(axis=0) gives one mean per column, which broadcasts across all rows. X / X.max(axis=0) normalizes instead of centering.
Next
Continue to: NumPy Arithmetic Operations for element-wise math and matrix operations.
🧪 Try It Yourself
Exercise 1 – Broadcast a Scalar
Tab indents. Press Escape, then Tab, to leave the editor. Control plus Enter runs the code; Control plus Shift plus Enter submits it.
Press Run to see what your code prints.Exercise 2 – Broadcast a Row Vector Across a Matrix
Tab indents. Press Escape, then Tab, to leave the editor. Control plus Enter runs the code; Control plus Shift plus Enter submits it.
Press Run to see what your code prints.Exercise 3 – Fix a Shape Mismatch
Tab indents. Press Escape, then Tab, to leave the editor. Control plus Enter runs the code; Control plus Shift plus Enter submits it.
Press Run to see what your code prints.