Python Tutorial
NumPy Copy vs View
A copy owns its data. A view shares memory with the original. Changing a view can change the source array.
Copy
import numpy as np
arr = np.array([1, 2, 3, 4])
x = arr.copy()
x[0] = 99
print(arr) # [1 2 3 4] unchanged
print(x) # [99 2 3 4]View
arr = np.array([1, 2, 3, 4])
x = arr.view()
x[0] = 99
print(arr) # [99 2 3 4] changed
print(x)base
arr.base is None for a copy (owns data) and points at the original for a view:
print(arr.copy().base) # None
print(arr.view().base) # the original arrayWhen You Get a View
Basic slices (arr[1:4]) are typically views. Fancy indexing (arr[[0, 2]]) returns a copy. Call .copy() whenever you will mutate a subset and must not touch the source.
📘 Real-World Deep Dive
Knowing <strong>NumPy Copy View (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 Copy View that you'd actually see in a data pipeline or analytics notebook.
Real-Life Example
import numpy as np
a = np.arange(5)
v = a.view() # same buffer
c = a.copy()
v[0] = 99
print("a:", a, "c:", c)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 Copy View 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.