Assegnazione di array Numpy con copia


103

Ad esempio, se abbiamo un numpyarray Ae vogliamo un filenumpy array Bcon gli stessi elementi.

Qual è la differenza tra i seguenti (vedi sotto) metodi? Quando viene allocata memoria aggiuntiva e quando no?

  1. B = A
  2. B[:] = A(uguale a B[:]=A[:]?)
  3. numpy.copy(B, A)

Risposte:


127

Tutte e tre le versioni fanno cose diverse:

  1. 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.

  2. 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).

  3. 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?


21
@Mr_and_Mrs_D: gli array Numpy funzionano in modo diverso rispetto agli elenchi. Se si taglia un array non si crea una copia, si crea solo una nuova vista sui dati dell'array esistente.
Blckknght

Cosa si intende per but B = A[:] would do something more like 1? Secondo questo stackoverflow.com/a/2612815 new_list = old_list[:] è anche una copia.
mrgloom

4
@mrgloom: gli array Numpy funzionano in modo diverso dagli elenchi quando si tratta di affettare e copiare il loro contenuto. Un array è una "vista" di un blocco di memoria sottostante in cui sono memorizzati i valori numerici. Fare uno slice come 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.
Blckknght

27
  1. B=A crea un riferimento
  2. B[:]=A fa una copia
  3. numpy.copy(B,A) fa una copia

gli ultimi due richiedono memoria aggiuntiva.

Per creare una copia completa è necessario utilizzare B = copy.deepcopy(A)


2
Facendo riferimento al tuo secondo esempio: 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
Rolf Bartstra

11

Questa è l'unica risposta funzionante per me:

B=numpy.array(A)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.