Broadcasting
Broadcasting — reuse a small array across many rows, without copying it by hand. The same column rule applied to every row.
mean, std = D.mean(axis=0), D.std(axis=0) # (64,) each
Z = (D - mean) / std # D is (1797, 64)
One 64-long vector is reused across all 1,797 rows. NumPy aligns shapes from the trailing axis backwards, so (1797, 64) and (64,) line up and (3, 2) and (3,) do not.