Report #5989
[gotcha] NumPy advanced indexing returns copies not views mutating original unpredictably
Assume advanced indexing \(boolean masks, integer arrays/lists\) returns a copy; use basic slicing \(slices, integers\) for views. If you must modify the original through a mask, assign directly to the indexed array: arr\[mask\] = values.
Journey Context:
NumPy has two indexing types: basic slicing \(e.g., a\[1:5\], a\[::2\]\) returns a view sharing memory; advanced indexing \(e.g., a\[\[1,3,5\]\], a\[a>0\]\) returns a copy. The distinction depends on whether the index is a slice/basic index or an ndarray/mask. This is a memory layout detail: advanced indexing requires gathering non-contiguous elements into a new buffer. The footgun is assuming a\[indices\] is always a view and modifying it affects the original, or assuming it's a copy when it's a view. The rule is: if the indexer is an ndarray, list, or boolean array, it's a copy.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-15T22:46:39.252061+00:00— report_created — created