Risposte:
Tutte e tre le versioni fanno cose diverse:
B = A
Questo associa un nuovo nome B
all'oggetto esistente già denominato A
. Successivamente si riferiscono allo stesso oggetto, quindi se ne modifichi uno in posizione, vedrai il cambiamento anche attraverso l'altro.
B[:] = A
(uguale a B[:]=A[:]
?)
Copia i valori da A
in un array esistente B
. I due array devono avere la stessa forma affinché funzioni. B[:] = A[:]
fa la stessa cosa (ma B = A[:]
farebbe qualcosa di più simile a 1).
numpy.copy(B, A)
Questa non è una sintassi legale. Probabilmente intendevi B = numpy.copy(A)
. È quasi uguale a 2, ma crea un nuovo array, invece di riutilizzare l' B
array. Se non ci fossero altri riferimenti al B
valore precedente , il risultato finale sarebbe lo stesso di 2, ma utilizzerà temporaneamente più memoria durante la copia.
O forse intendevi numpy.copyto(B, A)
, che è legale ed è equivalente a 2?
but B = A[:] would do something more like 1
? Secondo questo stackoverflow.com/a/2612815 new_list = old_list[:]
è anche una copia.
some_array[:]
creerà un nuovo oggetto array, ma quel nuovo oggetto sarà una vista della stessa memoria dell'array originale, che non sarà stato copiato. Ecco perché ho detto che è più simile B = A
. Ci vuole solo O(1)
spazio e tempo, piuttosto che O(n)
di ciascuno di cui avrebbe bisogno una copia reale.
B=A
crea un riferimentoB[:]=A
fa una copianumpy.copy(B,A)
fa una copiagli ultimi due richiedono memoria aggiuntiva.
Per creare una copia completa è necessario utilizzare B = copy.deepcopy(A)
B[:] = A
non non fare una copia completa di array di oggetti di tipo, per esempio A = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O')
. Ora prova B[:] = A; B[0][0]=99
, questo cambierà il primo elemento sia in A che in B ! Per quanto ne so, non c'è altro modo per garantire una copia completa, anche di un array numpy, checopy.deepcopy