2016-11-05 5 views
0

was die Differenz unter Codes istNumpy vs integrierten Kopierliste

eingebaute Liste Code

>>> a = [1,2,3,4] 
>>> b = a[1:3] 
>>> b[1] = 0 
>>> a 
[1, 2, 3, 4] 
>>> b 
[2, 0] 

numpy Array

>>> c = numpy.array([1,2,3,4]) 
>>> d = c[1:3] 
>>> d[1] = 0 
>>> c 
array([1, 2, 0, 4]) 
>>> d 
array([2, 0]) 

als es ist in numply arr gesehen ay c erfolgt direkt. Ich denke, in eingebauten Listen wird neuer Speicher für die Variable b zugewiesen. Wahrscheinlich in numpy ist die Referenz von c [1: 3] d zugewiesen, über diese bin ich nicht klar. Wie funktioniert das für numpy und eingebaute?

+0

Mögliche Duplikat [Array vs Vektor vs Liste] (http://stackoverflow.com/questions/1905417/array-vs -Vektor-vs-Liste) – polka

+0

@polka Danke für die schnelle Antwort, aber es ist nicht genug klar für mich. – umtkas

+0

Beachten Sie, dass es nicht korrekt ist, von einer anonymen Liste zu sprechen. Es ist ein numpliges Array. – chthonicdaemon

Antwort

2

Der entscheidende Punkt ist, dass jede Zuweisung in Python einen Namen mit einem Objekt im Speicher verknüpft. Python kopiert niemals bei der Zuweisung. Es wird nun wichtig zu verstehen, wann neue Objekte erstellt werden und wie sie sich verhalten.

In Ihrem ersten Beispiel erstellt das Slicing in der Liste ein neues Listenobjekt. In diesem Fall verweisen beide Listen auf einige der gleichen Objekte (int 2 und int 3). Die Tatsache, dass diese Referenzen kopiert werden, wird als "flache" Kopie bezeichnet. Mit anderen Worten, die Referenzen werden kopiert, aber die Objekte, auf die sie sich beziehen, sind immer noch dieselben. Beachten Sie, dass dies unabhängig von der Art der in der Liste gespeicherten Daten wahr ist.

Nun erstellen wir ein neues Objekt (int 0) und weisen es b[1] = 0 zu. Weil a und b separate Listen sind, sollte es uns nicht überraschen, dass sie jetzt verschiedene Elemente zeigen.

Ich mag die pythontutor visualisation dieser Situation.

In der Array-Fall, "All arrays generated by basic slicing are always views of the original array.".

Dieses neue Objekt teilt Daten mit dem Original, und die indizierte Zuweisung wird so gehandhabt, dass Aktualisierungen der Ansicht die gemeinsam genutzten Daten aktualisieren.

2

Dies wurde viel abgedeckt, aber ein gutes Duplikat zu finden ist zu viel Arbeit. :(

Mal sehen, ob ich schnell sich die Dinge mit Ihren Beispiele beschreiben können.

>>> a = [1,2,3,4] # a list contains pointers to numbers elsewhere 
>>> b = a[1:3] # a new list, with copies of those pointers 
>>> b[1] = 0 # change one pointer in b 
>>> a 
[1, 2, 3, 4] # does not change any pointers in a 
>>> b 
[2, 0] 

Ein array eine andere Struktur hat - es einen Datenpuffer mit ‚raw‘ Zahlen (oder andere Byte-Werte)

numpy array 
>>> c = numpy.array([1,2,3,4]) 
>>> d = c[1:3]  # a view; a new array but uses same data buffer 
>>> d[1] = 0  # change a value in d; 
>>> c 
array([1, 2, 0, 4]) # we see the change in the corrsponding slot of c 
>>> d 
array([2, 0]) 

der entscheidende Punkt mit Listen ist, dass sie Zeiger auf Objekte enthalten können Sie die Zeiger kopieren, ohne die Objekte zu kopieren;.. und Sie können ohne Änderung anderer Kopien der Zeiger Zeiger ändern

Um Speicher und Geschwindigkeit numpy als implementiert ein Konzept von view zu speichern. Es kann ein neues Array erstellen, ohne dass Werte aus dem Original kopiert werden, da es den Datenpuffer gemeinsam nutzen kann. Es ist jedoch auch möglich, eine Kopie, z.

e = c[1:3].copy() 
e[0] = 10 
# no change in c 

view v copy ist ein großes Thema in numpy und fundamental, besonders wenn sie mit verschiedenen Arten der Indizierung zu tun (Scheiben, Basic, Advanced). Wir können Ihnen bei Fragen helfen, aber Sie sollten auch die numpy Dokumente lesen. Es gibt keinen Ersatz für das Verständnis der Grundlagen, wie ein numpy Array gespeichert ist.

http://scipy-cookbook.readthedocs.io/items/ViewsVsCopies.html

http://www.scipy-lectures.org/advanced/advanced_numpy/ (kann weiter fortgeschritten sein, dass das, was Sie jetzt brauchen)