NumPy Cheatsheet
Shape and Reshaping
Use this NumPy reference while you build software engineering projects, review code, or refresh the syntax you reach for most.
Inspecting Shape
import numpy as np a = np.arange(24) a.shape # (24,) a.ndim # 1 a.size # 24 b = a.reshape(4, 6) b.shape # (4, 6) b.ndim # 2
reshape
a = np.arange(12) a.reshape(3, 4) # view when possible, copy otherwise a.reshape(3, -1) # -1 infers the missing dimension → (3, 4) a.reshape(-1, 4) # → (3, 4) a.reshape(-1) # always 1-D (same as ravel with default order) np.reshape(a, (3, 4)) # function form a.reshape(3, 4, order="C") # row-major (default) a.reshape(3, 4, order="F") # column-major (Fortran)
View vs copy:
reshapereturns a view if the array is contiguous; otherwise it copies. Check withresult.base is a.
Flattening
| Method | Returns | View? | Order |
|---|---|---|---|
a.ravel() | 1-D | view when possible | C (default) |
a.ravel(order="F") | 1-D | view when possible | Fortran |
a.flatten() | 1-D | always copy | C (default) |
a.flatten("F") | 1-D | always copy | Fortran |
b = np.array([[1, 2], [3, 4]]) b.ravel() # [1, 2, 3, 4] view b.flatten() # [1, 2, 3, 4] copy b.ravel("F") # [1, 3, 2, 4] column-major order
Adding and Removing Axes
a = np.array([1, 2, 3]) # shape (3,) # Add an axis a[np.newaxis, :] # shape (1, 3) a[:, np.newaxis] # shape (3, 1) np.expand_dims(a, axis=0) # (1, 3) np.expand_dims(a, axis=1) # (3, 1) np.expand_dims(a, axis=-1) # (3, 1) np.expand_dims(a, axis=(0, 2)) # multiple axes at once b = np.array([[[1, 2, 3]]]) # shape (1, 1, 3) np.squeeze(b) # (3,) — removes ALL size-1 axes np.squeeze(b, axis=0) # (1, 3) — remove specific axis np.squeeze(b, axis=(0,1)) # (3,)
Transposing and Permuting Axes
a = np.arange(24).reshape(2, 3, 4) a.T # reverses axes: (4, 3, 2) np.transpose(a) # same np.transpose(a, axes=(1, 0, 2)) # custom permutation → (3, 2, 4) np.moveaxis(a, 0, -1) # move axis 0 to end → (3, 4, 2) np.moveaxis(a, [0, 1], [-1, -2]) # move multiple np.rollaxis(a, 2) # roll axis 2 to front → (4, 2, 3) (legacy) np.swapaxes(a, 0, 1) # swap two axes → (3, 2, 4)
Stacking and Concatenating
a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) np.concatenate([a, b]) # [1,2,3,4,5,6] along axis 0 np.concatenate([a, b], axis=0) # same np.stack([a, b]) # [[1,2,3],[4,5,6]] new axis at 0 np.stack([a, b], axis=1) # [[1,4],[2,5],[3,6]] new axis at 1 np.vstack([a, b]) # vertical stack → [[1,2,3],[4,5,6]] np.hstack([a, b]) # horizontal stack → [1,2,3,4,5,6] np.dstack([a, b]) # depth stack → [[[1,4],[2,5],[3,6]]] # 2-D examples m = np.array([[1, 2], [3, 4]]) n = np.array([[5, 6]]) np.vstack([m, n]) # (3, 2) np.hstack([m, m]) # (2, 4) np.concatenate([m, m], axis=1) # same as hstack for 2-D # Block assembly (NumPy ≥ 1.13) np.block([[m, m], [n, n]]) # (3, 4) block matrix
Performance note
np.concatenate is fastest for large arrays; np.stack / vstack / hstack are convenience wrappers around it.
Splitting
a = np.arange(12) np.split(a, 3) # [array([0,1,2,3]), array([4,5,6,7]), array([8,9,10,11])] np.split(a, [3, 7]) # split at indices 3 and 7 → 3 pieces b = np.arange(16).reshape(4, 4) np.vsplit(b, 2) # split into 2 row-groups np.hsplit(b, 2) # split into 2 col-groups np.dsplit(c, 2) # split along depth (3-D) np.array_split(a, 3) # allows unequal splits (no error)
Tiling and Repeating
np.tile(a, 3) # repeat array 3 times along axis 0 np.tile(a, (2, 3)) # 2 times vertically, 3 times horizontally np.repeat(a, 2) # repeat each element: [0,0,1,1,2,2,...] np.repeat(a, [1, 2, 1]) # per-element repeat counts
Broadcasting-Friendly Reshaping Patterns
row = np.array([1, 2, 3]) # (3,) col = np.array([10, 20, 30]) # (3,) # outer sum via reshape row[np.newaxis, :] + col[:, np.newaxis] # (3, 3) — each row+col pair # batch matrix multiply prep A = np.ones((5, 3, 4)) # batch of 5 matrices B = np.ones((4, 2)) # single matrix A @ B # (5, 3, 2) — B broadcast over batch dim