Frage an numpy, python – Warum behandelt Numpy a + = b und a = a + b unterschiedlich

24

Ist das folgende Verhalten absichtlich oder ein Fehler?

from numpy import *

a = arange(5)
a = a+2.3
print 'a = ', a
# Output: a = 2.3, 3.3, 4.3, 5.3, 6.3 

a = arange(5)
a += 2.3
print 'a = ', a
# Output: a = 2, 3, 4, 5, 6

Python-Version: 2.7.2, Numpy-Version: 1.6.1

Deine Antwort

2   die antwort
8

@aix ist völlig richtig.. Zum Beispiel:

>>> a = []
>>> b = a
>>> a += [1]
>>> print a
[1]
>>> print b
[1]
>>> a = a + [2]
>>> print a
[1, 2]
>>> print b
[1]

Wie du siehst+= ändert die Liste und+ Erstellt eine neue Liste. Dies gilt auch für Numpy.+ Erstellt ein neues Array, sodass es ein beliebiger Datentyp sein kann.+= Ändert das Array an seinem Platz und es ist nicht praktisch und nicht wünschenswert, wenn Numpy den Datentyp eines Arrays ändert, wenn der Array-Inhalt geändert wird.

Guter Punkt, danke Dhara
41

Das ist beabsichtigt.

Das+= Der Operator behält den Typ des Arrays bei. Mit anderen Worten, ein Array von Ganzzahlen bleibt ein Array von Ganzzahlen.

Dies ermöglicht NumPy die Ausführung von+= Betrieb unter Verwendung des vorhandenen Array-Speichers. Auf der anderen Seite,a=a+b Erstellt ein brandneues Array für die Summe und bindet erneuta auf dieses neue Array zeigen; Dies erhöht den für den Vorgang verwendeten Speicherplatz.

Um das zu zitierenDokumentation:

Warnung: In-Place-Operationen führen die Berechnung mit der Genauigkeit durch, die durch den Datentyp der beiden Operanden festgelegt wird, stürzen jedoch das Ergebnis (falls erforderlich) stillschweigend herunter, damit es wieder in das Array passt. Für Berechnungen mit gemischter Genauigkeit gilt daher:A {op}= B kann anders sein alsA = A {op} B. Nehmen wir zum Beispiel ana = ones((3,3)). Dann,a += 3j ist anders alsa = a + 3j: während beide die gleiche Berechnung durchführen,a += 3 Wirft das Ergebnis so, dass es wieder passta, wohingegena = a + 3j bindet den Namen neua zum Ergebnis.

Schließlich, wenn Sie sich fragen, waruma war in erster Linie ein Integer-Array, beachten Sie Folgendes:

In [3]: np.arange(5).dtype
Out[3]: dtype('int64')

In [4]: np.arange(5.0).dtype
Out[4]: dtype('float64')
@Dhara: Ich bin damit einverstanden, dass dies unerwartet sein kann, wenn es zum ersten Mal auftritt. Es kann auch nützlich sein. Jedenfalls habe ich ein Zitat aus der Dokumentation hinzugefügt, das das Verhalten erklärt. NPE
Ich verstehe, dass a eine Ganzzahl ist, aber das erwartete Ergebnis in Python beim Hinzufügen von Floats und Ganzzahlen ist ein Float. Dies ist also ein unerwartetes "Feature". Dhara
In-Place-Vorgänge können viel schneller sein (keine Zuordnung, bessere Cache-Auslastung) und wenn Sie alle vorhandenen Verweise auf dieses Array beibehalten können (wenn Sie über haarige Datenstrukturen verfügen). Auch diese sind sehr nützlich für Programmierer mit C / C ++ / Fortran-Hintergrund. Dima Tisnek

Verwandte Fragen