NumPy: lesson 3 of 3
NumPy
Vectorization, Aggregations, and Broadcasting
Apply numerical operations across arrays, summarize data, and use broadcasting without manual loops.
Concept
Vectorization means expressing an operation for a whole NumPy array instead of manually applying it to one element at a time in Python. Aggregations reduce many values to a summary such as a mean or standard deviation. Broadcasting lets NumPy apply compatible smaller values, such as a scalar or one value per column, across a larger array.
Why It Matters
Numerical Data Science work often repeats simple arithmetic across every observation: increase sales by a rate, center a feature, compare predictions with a threshold, or summarize values. Array operations make the intended calculation visible and avoid writing routine element-by-element loops.
Intuition
Vectorization is like telling a spreadsheet to apply the same formula down a column. Aggregation is like asking for a column total or average. Broadcasting is like using one tax rate for every row, or one baseline value for each feature column.
Vectorization
Consider monthly sales that receive a ten percent increase.
import numpy as np
sales = np.array([1200, 1500, 1800, 1100])
increased_sales = sales * 1.10
print(increased_sales)
Expected output:
[1320. 1650. 1980. 1210.]
NumPy multiplies every element by 1.10. You could write a Python loop, but this expression states the business calculation directly. Vectorized operations are typically a good fit for large numerical arrays because NumPy performs the repeated numeric work outside the usual Python loop machinery; the important practical benefit here is clearer array-oriented code, not a promise about a particular benchmark.
More Element-Wise Operations
Arithmetic and comparisons normally operate element by element when array shapes align.
actual_sales = np.array([1200, 1500, 1800])
forecast_sales = np.array([1150, 1600, 1750])
forecast_error = actual_sales - forecast_sales
above_target = actual_sales >= 1500
print(forecast_error)
print(above_target)
Expected output:
[ 50 -100 50]
[False True True]
The matching position in each array represents the same period. Do not subtract arrays unless that alignment is meaningful.
Aggregations
Aggregations summarize an array. Common methods are sum(), mean(), min(), max(), and std(). NumPy also provides np.median().
temperatures = np.array([19.5, 21.0, 20.5, 25.0, 22.0])
print(temperatures.sum())
print(temperatures.mean())
print(np.median(temperatures))
print(temperatures.min(), temperatures.max())
print(temperatures.std())
Expected output:
108.0
21.6
21.0
19.5 25.0
1.854...
The final decimal may display differently. The sum gives a total; the mean gives an average; the median gives the middle value after sorting; minimum and maximum show the range; standard deviation describes how spread out the values are. A large standard deviation suggests values vary more around their mean, but it does not by itself explain why.
Aggregating a 2D Array with axis
For a matrix, axis tells NumPy which direction to reduce. In a feature matrix, rows are observations and columns are features.
sales_by_store = np.array([
[120, 140, 130],
[100, 160, 150],
])
print(sales_by_store.sum(axis=0))
print(sales_by_store.sum(axis=1))
Expected output:
[220 300 280]
[390 410]
axis=0 moves down the rows and returns one result for each column: total sales for each period across stores. axis=1 moves across columns and returns one result for each row: total sales for each store. A useful memory aid: the axis you name is the axis that disappears.
Broadcasting with a Scalar
Broadcasting lets NumPy treat a scalar as if it were available for every array position.
customer_spend = np.array([80.0, 120.0, 200.0])
service_fee = 5.0
spend_after_fee = customer_spend + service_fee
print(spend_after_fee)
Expected output: [ 85. 125. 205.]. No loop is needed because the single fee is compatible with every value.
Broadcasting Across a Feature Matrix
Broadcasting can also apply one value per column. This is useful for centering or normalizing features.
feature_values = np.array([
[20.0, 100.0],
[30.0, 150.0],
[40.0, 200.0],
])
column_means = feature_values.mean(axis=0)
centered_features = feature_values - column_means
print(column_means)
print(centered_features)
Expected output:
[ 30. 150.]
[[-10. -50.]
[ 0. 0.]
[ 10. 50.]]
column_means has shape (2,), one mean for each feature column. NumPy applies those two values across each compatible row. Centering is an introductory preprocessing idea: it shifts each feature so its average becomes zero. It does not yet scale features to the same spread.
Common Shape and Broadcasting Errors
Broadcasting is not magic; dimensions must be compatible. Two arrays with shapes (3, 2) and (3,) are not automatically a “one value per row” pairing, because the final dimensions do not match. If you truly need one value per row, reshape it to (3, 1).
row_adjustments = np.array([1.0, 2.0, 3.0]).reshape(3, 1)
adjusted_features = feature_values + row_adjustments
print(adjusted_features)
The reshaped adjustments have one row-compatible value per observation, which NumPy can apply across both columns.
Code Explanation
Vectorized expressions create new arrays from aligned values. Aggregations reduce a dimension, which is why their output shape changes. Broadcasting compares dimensions from the right and repeats compatible values conceptually; you do not need to memorize every advanced rule yet. Instead, inspect both shapes and ask whether the pairing represents the calculation you mean.
When to Use It
Use vectorized arithmetic for repeated numerical transformations, aggregations for summaries and quality checks, and broadcasting for scalar adjustments or per-feature transformations. Use an explicit loop when the work is truly sequential or each record needs complex custom control flow.
Best Practices
Check shapes before combining arrays and use meaningful names such as column_means rather than mean_values. Verify an aggregation's axis with a tiny example before applying it to a real matrix. When normalizing data, compute statistics from the appropriate dataset split to avoid leaking information from validation or test data into training.
Data Science Perspective
Vectorization powers many Pandas and NumPy transformations. Aggregations support exploratory analysis and model monitoring. Broadcasting underlies centering, scaling, and feature transformations used before many ML models. The same matrix thinking also appears when working with batches of model predictions.
Interview Perspective
Question: What does axis=0 mean for a matrix of rows and columns? A strong answer: it reduces down the rows and produces one result per column, such as the mean of each feature.
Practice Questions
- Apply a 15% discount to an array of product prices without writing a loop.
- Given prediction probabilities, use a comparison to select values above 0.7.
- For a matrix of daily sales by store, explain whether
sum(axis=0)orsum(axis=1)gives each store's total.
Quick Quiz
- What does vectorization avoid for a simple array transformation? Answer: an explicit Python loop over each element.
- Which function returns the middle value after sorting? Answer:
np.median(). - In a feature matrix, what does
mean(axis=0)usually return? Answer: one mean for each feature column.
Key Takeaway
Key Takeaways
Vectorized operations express repeated numerical work clearly. Aggregations summarize values, and broadcasting applies compatible scalar, row, or column values across an array. Shape awareness keeps these operations meaningful.
Next Lesson
You now have the NumPy foundation needed to work more confidently with Pandas tables and later machine learning feature matrices.
Finish this lesson on your terms
Mark it complete when you have worked through the material and are ready to move on.