La differenza tra vista e copia di un array in Python

Quando estraggo un subarray tramite un'operazione di slicing ottengo una vista (view) della matrice originale.

Una vista (view) è un riferimento allo stesso spazio di memoria della variabile copiata.

Ad esempio, importo nel linguaggio Python il modulo numpy

>>> import numpy as np

Creo una matrice 3x3 e la assegno alla variabile A

>>> A=np.array([[1,2,3],[4,5,6],[7,8,9]])

Poi estraggo dalla matrice una sottomatrice 2x2 composta dalle prime due righe e colonne e la assegno alla variabile B

>>> B=A[0:2,0:2]

Il contenuto della matrice B è il seguente

>>> B
array([[1, 2],
[4, 5]])

La variabile B è una vista (view) dell'array A.

Questo vuol dire che la variabile B non contiene i dati ma soltanto i riferimenti allo stesso spazio di memoria della variabile A.

Pertanto, se modifico un dato nella variabile A, la stessa modifica si vede anche nella variabile B.

Ad esempio, modifico l'elemento (1,1) nell'array A

>>> A[0,0]=-1

Ora il contenuto della variabile A è il seguente

>>> A
array([[-1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9]])

La stessa modifica si ripercuote anche sulla vista nella variabile B perché ha un riferimento che punta allo stesso spazio di memoria

>>> B
array([[-1, 2],
[ 4, 5]])

Per evitare questa interdipendenza devo copiare i dati al momento dell'estrazione del subarray

Una copia è una copia fisica dei dati in uno spazio di memoria diverso rispetto alla variabile copiata.

In questo modo il contenuto della nuova variabile è del tutto indipendente dalla variabile copiata.

Ad esempio, estraggo le prime due righe e colonne della matrice indicando l'attributo copy()

>>> C=A[0:2,0:2].copy()

Il contenuto della variabile C è il seguente

>>> C
array([[-1, 2],
[ 4, 5]])

In questo caso la variabile C contiene una copia dei dati della variabile C memorizzati in un altro spazio di memoria della RAM.

Pertanto, se modifico un elemento della variabile A, la modifica non si ripercuote anche sulla variabile C

Ad esempio, modifico l'elemento (0,0) della variabile array A

>>> A[0,0]=-2

Il contenuto della variabile A è il seguente

>>> A
array([[-2, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9]])

La modifica alla variabile A non modifica il contenuto della variabile C.

>>> C
array([[-1, 2],
[ 4, 5]])

Altri modi per creare una copia dell'array

In alternativa, per creare una copia dell'array in Python posso anche usare la funzione np.copy() di numpy

>>> D=np.copy(A[0:2,0:2])

oppure la funzione np.array() con l'argomento copy=True

>>> E=np.array(A[0:2,0:2], copy="True")

Il risultato è lo stesso.

E così via.

 


 

Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

FacebookTwitterLinkedinLinkedin
knowledge base

Array con Numpy (Python)

Alcune funzioni utili