Python Tutorial
NumPy Logs
NumPy provides log2, log10, and log (natural log). Use frompyfunc with math.log for other bases.
log2, log10, log
Input must be positive.
import numpy as np
arr = np.arange(1, 10)
print(np.log2(arr))
print(np.log10(arr))
print(np.log(arr))📘 Real-World Deep Dive
Knowing <strong>NumPy Ufunc Logs (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 Logs that you'd actually see in a data pipeline or analytics notebook.
Real-Life Example
import numpy as np
x = np.array([1, np.e, 100])
print(np.log(x)) # natural log
print(np.log2(x))
print(np.log10(x))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 Logs 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.