Python Tutorial
NumPy Universal Functions
uFuncs are vectorized functions that operate element-wise on arrays — add, sqrt, logical ops — much faster than a Python loop.
Arithmetic
import numpy as np
x = np.array([1, 2, 3, 4])
y = np.array([5, 6, 7, 8])
print(np.add(x, y))
print(np.subtract(y, x))
print(np.multiply(x, y))
print(np.divide(y, x))
print(np.power(x, 2))
print(np.mod(y, x))Rounding and Roots
print(np.sqrt([1, 4, 9, 16]))
print(np.absolute([-2, -1, 0, 1]))
print(np.ceil([1.2, 2.8]))
print(np.floor([1.2, 2.8]))Logs and Trig
print(np.log([1, np.e, np.e**2]))
print(np.sin(np.array([0, np.pi / 2, np.pi])))Reductions
arr = np.array([[1, 2], [3, 4]])
print(np.sum(arr))
print(np.sum(arr, axis=0)) # column sums
print(np.mean(arr), np.min(arr), np.max(arr))📘 Real-World Deep Dive
Knowing <strong>NumPy Ufunc (NumPy)</strong> well is what turns NumPy from a curiosity into a daily tool — you'll reach for it in nearly every real project.
Real-Life Scenario
An end-to-end usage of NumPy Ufunc that you'd actually see in a data pipeline or analytics notebook.
Real-Life Example
import numpy as np
a = np.arange(5)
print(np.add(a, a))
print(np.multiply(a, 3))Expected Output
(see source)Common mistakes
- NumPy uses 0-based, C-order indexing — the rightmost axis is the *fastest-varying* one. Mixing it with Fortran-order arrays is a common surprise.
np.array([[1,2],[3,4]], dtype=int)is fine, but a ragged Python list produces dtype=object and silently disables vectorisation.- In-place ops (
a *= 2) sometimes break views instead of returning a new array; usenp.multiply(a, 2, out=...)if explicitness matters. - Treating NumPy Ufunc as a black box without reading the docs — the API has subtle defaults that bite when you scale.
🚀 Performance & Best Practices
- Vectorise: replace Python
forloops with ufuncs; you can expect 10–100× speedups. - Pre-allocate output arrays with
np.emptyinstead of growing them withnp.append. - Keep data in float32 unless you need float64 precision — half the memory, double the cache locality.
- When working with NumPy, prefer vectorised / batched operations over Python loops.
🧪 Try It Yourself
- Reproduce the snippet on a representative slice of your own data.
- Profile the snippet with
cProfileortimeitand find the single biggest improvement. - Generalise the snippet into a small, reusable function you can drop into future projects.