NumPy Linear Algebra Cheat Sheet
Reference for NumPy matrix operations, linear algebra functions like inverse, determinant, eigenvalues, and SVD, plus array broadcasting rules.
Array & Matrix Basics
Create and inspect arrays used as vectors and matrices.
import numpy as npA = np.array([[1, 2], [3, 4]])B = np.array([[5, 6], [7, 8]])A.T # transposeA.shape # (2, 2)np.zeros((3, 3))np.eye(3) # identity matrixnp.ones((2, 3))
Core linalg Operations
Matrix multiplication, inverse, determinant, eigenvalues, and solving systems.
A = np.array([[4, 2], [1, 3]])np.dot(A, B) # matrix multiplicationA @ B # matrix multiplication (preferred)np.linalg.inv(A) # matrix inversenp.linalg.det(A) # determinantnp.linalg.matrix_rank(A) # rankeigvals, eigvecs = np.linalg.eig(A) # eigenvalues/eigenvectors# Solve Ax = bb = np.array([1, 2])x = np.linalg.solve(A, b)# Singular Value DecompositionU, S, Vt = np.linalg.svd(A)np.linalg.norm(A) # Frobenius normnp.linalg.norm(b, ord=2) # L2 (Euclidean) norm
Broadcasting
Apply operations across arrays of different but compatible shapes.
a = np.array([1, 2, 3]) # shape (3,)b = np.array([[1], [2], [3]]) # shape (3, 1)a + b # broadcasts to shape (3, 3)M = np.random.rand(4, 3)row_means = M.mean(axis=1, keepdims=True) # shape (4, 1)centered = M - row_means # broadcasts across columns
Key Functions
The linalg functions you'll reach for most often.
- np.dot / @- Matrix multiplication; use @ for readability with 2D+ arrays
- np.linalg.inv- Computes the matrix inverse; raises LinAlgError for singular matrices
- np.linalg.solve- Solves Ax = b directly, more stable and faster than computing inv(A) @ b
- np.linalg.eig- Returns eigenvalues and eigenvectors of a square matrix
- np.linalg.svd- Singular Value Decomposition, used in PCA and dimensionality reduction
- broadcasting- NumPy's rule for applying operations across arrays of compatible but different shapes without copying data
- np.linalg.norm- Computes vector/matrix norms (L1, L2, Frobenius) for magnitude or regularization calculations
QR, Cholesky & LU-Style Decompositions
Factorize matrices for stable solves, least squares, and positive-definite systems.
import numpy as npA = np.array([[4.0, 2.0], [2.0, 3.0]])# QR decomposition: A = Q @ R, Q orthogonal, R upper triangularQ, R = np.linalg.qr(A)# Cholesky: A = L @ L.T, requires A symmetric positive-definiteL = np.linalg.cholesky(A)np.allclose(L @ L.T, A) # True# Least-squares solve for overdetermined systems (Ax ~= b)A_tall = np.random.rand(10, 3)b = np.random.rand(10)x, residuals, rank, sv = np.linalg.lstsq(A_tall, b, rcond=None)# Condition number - large values indicate a numerically unstable/near-singular matrixnp.linalg.cond(A)
einsum for Tensor Contractions
Express matrix products, batched operations, and reductions in a single compact call.
A = np.random.rand(3, 4)B = np.random.rand(4, 5)# Standard matrix multiplication via einsumC = np.einsum("ij,jk->ik", A, B) # same as A @ B# Batched matrix multiplication (e.g. stack of matrices, common in ML)batch_A = np.random.rand(8, 3, 4)batch_B = np.random.rand(8, 4, 5)batch_C = np.einsum("bij,bjk->bik", batch_A, batch_B)# Trace of a matrixtr = np.einsum("ii->", A[:, :3])# Outer product and elementwise-then-sum (dot product)v1 = np.array([1, 2, 3])v2 = np.array([4, 5, 6])outer = np.einsum("i,j->ij", v1, v2)dot = np.einsum("i,i->", v1, v2)
Symmetric Eigendecomposition & PCA by Hand
Use eigh for symmetric/Hermitian matrices and reconstruct a PCA projection manually.
# eigh is faster and numerically more stable than eig for symmetric matricescov = np.cov(data, rowvar=False) # data: (n_samples, n_features)eigvals, eigvecs = np.linalg.eigh(cov)# eigh returns ascending eigenvalues -> reverse for descending variance orderorder = np.argsort(eigvals)[::-1]eigvals, eigvecs = eigvals[order], eigvecs[:, order]# Project data onto top-k principal componentsk = 2components = eigvecs[:, :k]centered = data - data.mean(axis=0)projected = centered @ components# Explained variance ratioexplained_ratio = eigvals[:k] / eigvals.sum()
Vectorized Linear Algebra Over Batches
Apply linalg functions across a stack of matrices without Python loops.
# NumPy's linalg functions broadcast over leading dimensionsstack = np.random.rand(5, 3, 3) # 5 separate 3x3 matricesdets = np.linalg.det(stack) # shape (5,) - one det per matrixinvs = np.linalg.inv(stack) # shape (5, 3, 3) - one inverse per matrix# Solve Ax = b for a batch of systems at onceA_batch = np.random.rand(5, 3, 3)b_batch = np.random.rand(5, 3)x_batch = np.linalg.solve(A_batch, b_batch) # shape (5, 3)# Vectorized dot products of many vector pairs (no explicit loop)V1 = np.random.rand(1000, 3)V2 = np.random.rand(1000, 3)pairwise_dots = np.einsum("ij,ij->i", V1, V2)
Advanced Linear Algebra Terms
Concepts beyond basic matrix multiply/inverse that show up in numerical and ML code.
- np.linalg.eigh- Specialized eigendecomposition for symmetric/Hermitian matrices; faster and returns real, sorted-ascending eigenvalues
- np.linalg.cond- Condition number of a matrix; values >> 1 signal that solves/inverses will be numerically unstable
- np.linalg.lstsq- Least-squares solution for overdetermined or underdetermined systems, used instead of solve() when A isn't square
- np.einsum- Einstein summation notation for expressing arbitrary tensor contractions, sums, and products in one vectorized call
- Cholesky decomposition- Factorizes a symmetric positive-definite matrix as L @ L.T; roughly 2x faster than LU for such matrices
- np.linalg.matrix_power- Raises a square matrix to an integer power via repeated squaring, e.g. np.linalg.matrix_power(A, 5)
- batched linalg- Functions like det, inv, solve, eig operate on the last two axes and broadcast over leading batch dimensions
- np.linalg.pinv- Moore-Penrose pseudoinverse; works for singular or non-square matrices where inv() would raise an error
Prefer np.linalg.solve(A, b) over np.linalg.inv(A) @ b - solving the linear system directly is both faster and numerically more stable than explicitly computing the matrix inverse.