Führt die Zuweisung mit erweiterter Indexierung Array-Daten aus?

8

Ich versuche langsam, den Unterschied zwischen view s und copy s in numpy sowie mutable vs. unveränderlichen Typen zu verstehen.

Wenn ich mit 'erweiterte Indexierung' auf einen Teil eines Arrays zugreife Es soll eine Kopie zurückgeben. Das scheint zu stimmen:

%Vor%

Da c nur eine Kopie ist, teilt sie keine Daten, und wenn sie geändert wird, wird a nicht mutiert. Das verwirrt mich jedoch:

%Vor%

Es scheint also, selbst wenn ich erweiterte Indizierung verwende, behandelt die Zuweisung das Ding auf der linken Seite immer noch als Ansicht. Offensichtlich ist die a in Zeile 2 das gleiche Objekt / Daten wie die a in Zeile 6, da das Ändern von c keine Auswirkung hat.

Also meine Frage: Ist das a in Zeile 8 das selbe Objekt / Daten wie vorher (die Diagonale natürlich nicht mitgerechnet) oder ist es eine Kopie? Mit anderen Worten: Wurden die Daten von a in die neue a kopiert oder wurden ihre Daten an Ort und Stelle mutiert?

Zum Beispiel ist es so:

%Vor%

oder wie:

%Vor%

Ich weiß nicht, wie ich das überprüfen soll, denn in jedem Fall ist a.flags.owndata True . Bitte zögern Sie nicht, eine andere Frage zu formulieren oder zu beantworten, wenn ich darüber auf verwirrende Weise nachdenke.

    
askewchan 28.03.2013, 20:41
quelle

2 Antworten

6

Wenn Sie c = a[b] ausführen, wird a.__get_item__ mit b als einzigem Argument aufgerufen, und alles, was zurückgegeben wird, wird c zugewiesen.

Wenn Sie a[b] = c ausführen, wird a.__setitem__ mit b und c als Argumente aufgerufen, und alles, was zurückgegeben wird, wird automatisch verworfen.

Obwohl beide die gleiche a[b] -Syntax haben, machen beide Ausdrücke verschiedene Dinge. Sie könnten ndarray ableiten, diese zwei Funktionen überladen und sie sich anders verhalten. Wie standardmäßig in numpy, gibt ersteres eine Kopie zurück (wenn b ein Array ist), aber letzteres ändert a an Ort und Stelle.

    
Jaime 28.03.2013, 21:13
quelle
3

Ja, es ist das gleiche Objekt. So überprüfen Sie:

%Vor%

Das Zuweisen eines Ausdrucks in Python ist nicht dasselbe wie das Lesen des Wertes dieses Ausdrucks. Wenn Sie c = a[b] mit a[b] auf der rechten Seite des Gleichheitszeichens eingeben, wird ein neues Objekt zurückgegeben. Wenn Sie a[b] = 1 mit a[b] auf der linken Seite des Gleichheitszeichens eingeben, wird das ursprüngliche Objekt geändert.

Tatsächlich kann ein Ausdruck wie a[b] = 1 nicht ändern, an welchen Namen a gebunden ist. Der Code, der obj[index] = value behandelt, kann nur das Objekt obj kennen lernen, nicht den Namen, der für dieses Objekt verwendet wurde. Daher kann nicht geändert werden, auf was sich dieser Name bezieht.

    
BrenBarn 28.03.2013 20:53
quelle

Tags und Links