2013-10-30 10 views
59

Zum Beispiel, wenn wir eine numpy Array A haben, und wir wollen ein numpy Array B mit den gleichen Elementen.Numpy Array-Zuweisung mit Kopie

Was ist der Unterschied zwischen diesen Methoden? Wann wird zusätzlicher Speicher zugewiesen und wann nicht?

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

Antwort

69

Alle drei Versionen verschiedene Dinge tun.

  1. Dies bindet einen neuen Namen B an das bestehende Objekt bereits A benannt. Danach beziehen sie sich auf das gleiche Objekt. Wenn Sie also eines ändern, sehen Sie die Änderung auch durch das andere.

  2. Dies kopiert die Werte von A in ein vorhandenes Array B. Die beiden Arrays müssen die gleiche Form haben, damit dies funktioniert. B[:] = A[:] tut das gleiche (aber B = A[:] würde etwas mehr wie 1) tun.

  3. Dies ist keine legale Syntax. Du hast wahrscheinlich B = numpy.copy(A) gemeint. Das ist fast dasselbe wie 2, aber es erstellt ein neues Array, anstatt das Array B wiederzuverwenden. Wenn es keine anderen Verweise auf den vorherigen Wert B gäbe, wäre das Endergebnis gleich 2, aber während der Kopie wird vorübergehend mehr Speicher belegt.

    Edit: oder vielleicht meintest du numpy.copyto(B, A), die legal ist, und entspricht 2?

+0

'B = A [:]' _nicht_ die gleiche Sache tut überhaupt als 1! Versuchen Sie 'a = [1, 2, 3]; b = a [:]; b.append (4); Druck (b); Druck (a) '. Es definiert eine neue Referenz und kopiert eine darin. –

+4

@Mr_and_Mrs_D: Numpy-Arrays funktionieren anders als Listen. Durch das Schneiden eines Arrays wird keine Kopie erstellt. Es wird lediglich eine neue Ansicht der Daten des vorhandenen Arrays erstellt. – Blckknght

+3

Oh ich stehe korrigiert - danke. Lasst uns hier meinen Fehler machen, wie viele Python-Programmierer sich allerdings gefragt hätten :) –

18
  1. B=A eine Referenz
  2. B[:]=A schafft macht eine tiefe Kopie
  3. numpy.copy(B,A) macht eine Kopie

die letzten beiden benötigen zusätzlichen Speicher.

EDIT: Werfen Sie einen Blick auf diese Question

4

Dies ist die einzige für mich arbeiten Antwort:

B=numpy.array(A)