We can't find the internet
Attempting to reconnect
Something went wrong!
Attempting to reconnect
Apply Along an Axis
Turn each row of positive values into proportions that sum to one. Divide each value by the total of its own row, without mixing values from other rows.
Your task
Implement row_normalize(x) for a floating-point matrix of shape (m, n),
with n > 0 and strictly positive entries. Return the same shape, dtype and
device, leaving x unchanged.
row_total[i] = sum(x[i, j] over all columns j)
output[i, j] = x[i, j] / row_total[i]
For [[1, 3, 6], [2, 2, 4]], the row totals are 10 and 8. The result is
[[0.1, 0.3, 0.6], [0.25, 0.25, 0.5]]. Each row sums to one, up to
floating-point rounding. A row with just one positive value becomes [1].
Keep a dimension for broadcasting
Sum across the columns, which is axis 1. Keep that axis with size 1 so that
the totals have shape (m, 1). Dividing (m, n) by (m, 1) then applies
each total across the corresponding row's columns.
Use x / x.sum(dim=1, keepdim=True) in PyTorch or
x / x.sum(axis=1, keepdims=True) in JAX. Dropping the reduced axis gives
shape (m,), which may fail to broadcast or divide along the wrong direction.
For these positive inputs, dividing by the row sum is L1 normalization because the sum of absolute values equals the sum of values. No zero-row fallback or added epsilon is needed under the input contract. This is not softmax: do not exponentiate the values before dividing.
The shape diagram shows how one total per row is reused across its columns.
Loading visualization…
Understand the ideas behind this exercise. The Problem tab contains the exact implementation requirements.
Give each tensor axis a meaning
A tensor's shape tells you how many entries each axis has. It does not tell you
what those entries represent. For example, (batch, features) and
(features, batch) use different axis orders. Name the axes before choosing an
operation.
A reduction combines entries along an axis, for example by summing or
averaging. Averaging the features of a (B, D) tensor gives one number per
example, with shape (B,). Keeping the reduced axis gives shape (B, 1) instead.
For [[2, 4, 6], [1, 3, 5]], the row means with the axis kept are [[4], [3]].
Subtracting them from the input gives [[-2, 0, 2], [-2, 0, 2]]: each row has
been centered using its own mean.
Reshape and transpose do different jobs
A reshape regroups elements using the operation's traversal order. A transpose
changes the axis order. For the usual row-major reshape, [[1, 2, 3], [4, 5, 6]]
reshaped to (3, 2) becomes [[1, 2], [3, 4], [5, 6]]. Transposing the original
instead gives [[1, 4], [2, 5], [3, 6]].
Both results have shape (3, 2), but their entries mean different things. Check
values as well as shapes. Unequal axis sizes make many axis mistakes easier to
spot than square examples do.
Concatenate along an axis or stack on a new one
Concatenation extends an existing axis. Stacking creates a new axis. For two
arrays of shape (2, 3), concatenating on axis zero gives (4, 3). Stacking on
a new leading axis gives (2, 2, 3).
Your code, saved here
Sign in to access your accepted solutions and saved draft history. You can keep reading the lesson without an account.
Sign in to your accountStuck?
JAX reference solution
Sign in to track your attempts toward unlocking the reference solution.