NumPy Cheatsheet

Aggregations

Use this NumPy reference while you build software engineering projects, review code, or refresh the syntax you reach for most.

Overview

Aggregation functions reduce one or more axes to a scalar or lower-dimensional array. Most accept axis, keepdims, where, and out arguments.

import numpy as np

a = np.array([[1, 2, 3],
              [4, 5, 6]])

a.sum()              # 21 — all elements
a.sum(axis=0)        # [5, 7, 9]   — collapse rows, result shape (3,)
a.sum(axis=1)        # [6, 15]     — collapse cols, result shape (2,)
a.sum(axis=1, keepdims=True)  # [[6],[15]]  shape (2, 1) — preserves dims

Core Aggregation Methods

Method / FunctionDescription
a.sum() / np.sum(a)Sum of elements
a.prod() / np.prod(a)Product of elements
a.mean() / np.mean(a)Arithmetic mean
a.std() / np.std(a)Standard deviation
a.var() / np.var(a)Variance
a.min() / np.min(a)Minimum value
a.max() / np.max(a)Maximum value
np.median(a)Median (no method form)
np.percentile(a, q)q-th percentile
np.quantile(a, q)q in [0, 1] (same as percentile/100)
np.ptp(a)Peak-to-peak (max - min)
a.cumsum()Cumulative sum
a.cumprod()Cumulative product
np.cumsum(a)Same, function form
np.diff(a)n-th discrete difference
np.ediff1d(a)Differences, 1-D, with prepend/append
np.gradient(a)Gradient (central differences)

axis and keepdims

b = np.arange(24).reshape(2, 3, 4)

b.sum(axis=0)            # shape (3, 4) — sums over first axis
b.sum(axis=(0, 2))       # shape (3,)   — sums over axes 0 and 2
b.sum(axis=-1)           # shape (2, 3) — sums over last axis

b.mean(axis=1, keepdims=True)   # shape (2, 1, 4) — keeps all axes

ddof in std / var

a = np.array([2.0, 4.0, 4.0, 4.0, 5.0, 5.0, 7.0, 9.0])
a.std()             # population std (ddof=0 default) → 2.0
a.std(ddof=1)       # sample std (Bessel's correction)  → 2.138
a.var(ddof=1)       # sample variance

Min / Max with Indices

a = np.array([3, 1, 4, 1, 5, 9, 2, 6])
a.min()             # 1
a.max()             # 9
a.argmin()          # 1   (flat index)
a.argmax()          # 5

b = np.array([[3, 1], [4, 2]])
b.argmin(axis=0)    # [0, 0]  — per-column min index
b.argmax(axis=1)    # [0, 0]  — per-row max index

Percentile and Quantile

a = np.arange(10, dtype=float)
np.percentile(a, 50)                # 4.5  — median
np.percentile(a, [25, 50, 75])      # [2.25, 4.5, 6.75]
np.percentile(a, 90, method="linear")   # default interpolation
np.percentile(a, 90, method="nearest")  # snap to actual value

# Available methods (NumPy ≥ 1.22, replaces interpolation=)
# "inverted_cdf", "averaged_inverted_cdf", "closest_observation",
# "interpolated_inverted_cdf", "hazen", "weibull", "linear",
# "median_unbiased", "normal_unbiased", "nearest", "midpoint", "lower", "higher"

np.quantile(a, 0.5)          # same but q in [0, 1]
np.quantile(a, [0.25, 0.75]) # IQR bounds

b = np.random.rand(4, 10)
np.percentile(b, 75, axis=1)   # per-row 75th percentile
np.percentile(b, 75, axis=1, keepdims=True)  # shape (4, 1)

Cumulative Operations

a = np.array([1, 2, 3, 4])
np.cumsum(a)      # [1, 3, 6, 10]
np.cumprod(a)     # [1, 2, 6, 24]

b = np.array([[1, 2], [3, 4]])
np.cumsum(b, axis=0)   # [[1,2],[4,6]]  — cumulative down rows
np.cumsum(b, axis=1)   # [[1,3],[3,7]]  — cumulative across cols

Differences

a = np.array([1, 4, 9, 16, 25])
np.diff(a)            # [3, 5, 7, 9]   — first differences
np.diff(a, n=2)       # [2, 2, 2]      — second differences
np.diff(a, prepend=0) # [1, 3, 5, 7, 9]  — prepend before diff

np.ediff1d(a, to_begin=[-99], to_end=[99])  # prepend/append to result
np.gradient(a)        # [3., 4., 6., 8., 9.]  — gradient (edge: one-sided)
np.gradient(np.random.rand(4, 4), axis=0)   # gradient along axis 0

NaN-aware Aggregations

All standard aggregations propagate NaN by default. Use nan* variants to ignore them:

NormalNaN-ignoring
np.sum(a)np.nansum(a)
np.mean(a)np.nanmean(a)
np.std(a)np.nanstd(a)
np.var(a)np.nanvar(a)
np.min(a)np.nanmin(a)
np.max(a)np.nanmax(a)
np.argmin(a)np.nanargmin(a)
np.argmax(a)np.nanargmax(a)
np.percentile(a, q)np.nanpercentile(a, q)
np.quantile(a, q)np.nanquantile(a, q)
np.median(a)np.nanmedian(a)
np.cumsum(a)np.nancumsum(a)
np.cumprod(a)np.nancumprod(a)
np.prod(a)np.nanprod(a)
a = np.array([1.0, np.nan, 3.0, np.nan, 5.0])
np.mean(a)      # nan
np.nanmean(a)   # 3.0
np.nansum(a)    # 9.0

Boolean Aggregations

a = np.array([True, False, True, True])
np.any(a)       # True   — at least one True
np.all(a)       # False  — not all True
np.count_nonzero(a)   # 3

b = np.array([[1, 0], [3, 4]])
np.any(b, axis=0)    # [True, True]
np.all(b, axis=1)    # [False, True]
np.count_nonzero(b, axis=0)  # [2, 1]

where argument (conditional aggregation)

a = np.array([1.0, -2.0, 3.0, -4.0, 5.0])
mask = a > 0
np.sum(a, where=mask, initial=0)   # sum only positive values → 9.0
np.mean(a, where=mask)             # mean of positive values

initial is required for sum/prod when using where, so NumPy knows the identity element for empty selections.

Weighted and Moving Aggregations

a = np.array([1.0, 2.0, 3.0, 4.0])
w = np.array([1.0, 2.0, 3.0, 4.0])
np.average(a, weights=w)          # weighted average = (1+4+9+16)/10 = 3.0
np.average(a)                      # unweighted mean (same as np.mean)

# Moving average (window=3) via convolution
window = np.ones(3) / 3
np.convolve(a, window, mode="valid")   # [2., 3.]
np.convolve(a, window, mode="same")    # [1., 2., 3., 2.333]

Histogram

data = np.random.randn(1000)
counts, edges = np.histogram(data, bins=20)
counts, edges = np.histogram(data, bins=20, range=(-3, 3))
counts, edges = np.histogram(data, bins=np.linspace(-3, 3, 21))
density, edges = np.histogram(data, bins=20, density=True)  # normalize to PDF

# 2-D histogram
x = np.random.randn(1000)
y = np.random.randn(1000)
H, xedges, yedges = np.histogram2d(x, y, bins=10)
H, xedges, yedges = np.histogram2d(x, y, bins=[20, 15])

# Histogram bin indices
np.digitize(data, bins=edges)   # which bin each value falls into

Unique and Set Operations

a = np.array([3, 1, 2, 1, 3, 3])
np.unique(a)                          # [1, 2, 3]
np.unique(a, return_counts=True)      # ([1,2,3], [2,1,3])
np.unique(a, return_index=True)       # (unique, first-occurrence indices)
np.unique(a, return_inverse=True)     # (unique, indices to reconstruct a)

np.bincount(a)    # [0, 2, 1, 3]  — count of each non-neg int (0-indexed)
np.bincount(a, weights=np.ones_like(a, dtype=float))  # weighted count