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.