Risposte:
Tutte e tre le versioni fanno cose diverse:
B = A
Questo associa un nuovo nome Ball'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 Ain 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' Barray. Se non ci fossero altri riferimenti al Bvalore 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[:] = Anon 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