Antworten:
Alle drei Versionen machen unterschiedliche Dinge:
B = A
Dadurch wird ein neuer Name Ban das bereits benannte vorhandene Objekt gebunden A. Danach beziehen sie sich auf dasselbe Objekt. Wenn Sie also eines an Ort und Stelle ändern, sehen Sie die Änderung auch durch das andere.
B[:] = A(wie B[:]=A[:]?)
Dadurch werden die Werte aus Aeinem vorhandenen Array kopiert B. Die beiden Arrays müssen dieselbe Form haben, damit dies funktioniert. B[:] = A[:]macht das gleiche ( B = A[:]würde aber eher etwas wie 1 machen).
numpy.copy(B, A)
Dies ist keine legale Syntax. Du hast es wahrscheinlich gemeint B = numpy.copy(A). Dies ist fast dasselbe wie 2, erstellt jedoch ein neues Array, anstatt das BArray wiederzuverwenden. Wenn es keine anderen Verweise auf den vorherigen BWert gäbe, wäre das Endergebnis dasselbe wie 2, aber es wird vorübergehend mehr Speicher während des Kopierens verbrauchen.
Oder haben Sie vielleicht gemeint numpy.copyto(B, A), was legal ist und 2 entspricht?
but B = A[:] would do something more like 1? Demnach ist stackoverflow.com/a/2612815 new_list = old_list[:] auch eine Kopie.
some_array[:]ausführen, wird ein neues Array-Objekt erstellt. Dieses neue Objekt ist jedoch eine Ansicht desselben Speichers wie das ursprüngliche Array, das nicht kopiert wurde. Deshalb habe ich gesagt, es ist eher so B = A. Es braucht nur O(1)Raum und Zeit und nicht die, die O(n)eine echte Kopie benötigen würde.
B=A erstellt eine ReferenzB[:]=A macht eine Kopienumpy.copy(B,A) macht eine KopieDie letzten beiden benötigen zusätzlichen Speicher.
Um eine tiefe Kopie zu erstellen, müssen Sie verwenden B = copy.deepcopy(A)
B[:] = AErstellt keine tiefe Kopie von Arrays vom Objekttyp, z A = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O'). Versuchen Sie nun B[:] = A; B[0][0]=99, dies ändert das erste Element in A und B ! Meines Wissens gibt es keinen anderen Weg, um eine tiefe Kopie zu garantieren, selbst eines Numpy-Arrays, alscopy.deepcopy