Python Tutorial
NumPy Array Indexing
Access a single element with integer indexes. 2D arrays use [row, column].
1D Indexing
import numpy as np
arr = np.array([10, 20, 30, 40])
print(arr[0]) # 10
print(arr[-1]) # 402D Indexing
m = np.array([[1, 2, 3], [4, 5, 6]])
print(m[0, 1]) # 2 (row 0, column 1)
print(m[1, 2]) # 63D Indexing
t = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(t[1, 0, 1]) # 6Integer Array Indexing
Pick several positions at once:
arr = np.array([10, 20, 30, 40, 50])
print(arr[[0, 2, 4]]) # [10 30 50]📘 Real-World Deep Dive
Knowing <strong>NumPy Indexing (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 Indexing that you'd actually see in a data pipeline or analytics notebook.
Real-Life Example
import numpy as np
data = np.array([[10, 20], [30, 40], [50, 60]])
rows = [0, 2]
cols = [1, 1]
print("fancy:", data[rows, cols])
mask = data > 25
print("masked:", data[mask])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 Indexing 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.