Quando si lavora con NumPy, comprendere la differenza tra copie (copies) e viste (views) è fondamentale per scrivere codice efficiente e prevenire bug difficili da individuare. Questo tema è spesso sottovalutato, ma ha un impatto diretto su performance, memoria e comportamento dei dati.
Cos’è una copia in NumPy
Una copia è una duplicazione completa dei dati contenuti in un array. Questo significa che:
- I dati vengono replicati in memoria
- Modificare la copia non influisce sull’array originale
Esempio:
import numpy as npa = np.array([1, 2, 3])
b = a.copy()b[0] = 99print(a) # [1 2 3]
print(b) # [99 2 3]
In questo caso, b è completamente indipendente da a.
Quando usare una copia
- Quando vuoi proteggere i dati originali
- Quando devi fare operazioni che non devono avere effetti collaterali
- Quando lavori in contesti critici (es. machine learning, preprocessing dati
Cos’è una vista in NumPy
Una vista è un modo per accedere agli stessi dati senza copiarli. In pratica:
- I dati non vengono duplicati
- Più array condividono la stessa area di memoria
- Modificare la vista modifica anche l’array originale
Esempio:
a = np.array([1, 2, 3])
b = a.view()b[0] = 99print(a) # [99 2 3]
print(b) # [99 2 3]
👉 Qui a e b puntano agli stessi dati.
Quando usare una vista
- Quando vuoi risparmiare memoria
- Quando lavori con dataset molto grandi
- Quando hai bisogno di prestazioni elevate
Differenza tra copia e vista in NumPy
| Caratteristica | Copia | Vista |
|---|---|---|
| Memoria | Nuova allocazione | Condivisa |
| Modifiche | Indipendenti | Condivise |
| Performance | Più lenta | Più veloce |
| Sicurezza dati | Alta | Bassa (rischio side effects) |
In sintesi:
- Copia = sicurezza
- Vista = performance
Come capire se è una copia o una vista
Puoi verificare se un array è una vista controllando l’attributo .base:
print(b.base is a) # True se è una vista
- Se
.baserestituisce l’array originale → vista - Se restituisce
None→ copia
Attenzione: slicing e comportamento implicito
In NumPy, alcune operazioni restituiscono automaticamente viste, altre copie.
Vista (slice):
a = np.array([1, 2, 3, 4])
b = a[1:3] # vista
Copia (operazioni avanzate):
b = a[[1, 2]] # copia
Questo comportamento può causare bug se non lo conosci.
Best practice per usare copie e viste
Per evitare errori e ottimizzare le performance:
- Usa
.copy()quando vuoi isolamento totale - Usa viste per manipolazioni veloci su grandi dataset
- Controlla sempre
.basenei casi dubbi - Documenta il codice quando il comportamento non è ovvio