Tut mir leid, wenn dies ein bekanntes Problem ist, ich habe danach gesucht, aber es gibt so viele Ergebnisse...
Das funktioniert:
import numpy as np
a = np.array([1, 2, 3])
a = a / 4
Dies wirft jedoch einen Fehler auf:
import numpy as np
a = np.array([1, 2, 3])
a /= 4
Nämlich:
TypeError: No loop matching the specified signature and casting
was found for ufunc true_divide
Dies ist überraschend, da ich von ihnen erwarten würde, dass sie dasselbe tun.
Verwenden der numpy-Version 1.14.0.
Ich gehe davon aus, dass Sie Python 3 verwenden. Dies ist das erwartete Verhalten von Python 3. Das Ergebnis von a / 4
ist kein Integer-Array, sondern ein Gleitkomma-Array. Wenn Sie dieses Ergebnis einfach mit der Zeile a = a / 4
, ist das in Ordnung. Es wandelt den Code im Wesentlichen in a = np.true_divide(a, 4)
, wodurch ein neues Gleitkomma-Array erstellt und ihm der Name a
zugewiesen wird.
Wenn Sie versuchen, eine direkte Zuweisung durchzuführen, wird die true_divide
ufunc aufgefordert, wieder in das vorhandene a
Integer-Array auszugeben: np.true_divide(a, 4, out=a)
. Es gibt keine Implementierung von true_divide
, die zwei ganzzahlige Argumente akzeptiert und eine andere ganze Zahl ausgibt, sodass Sie die Ausnahme erhalten.
Danke für die klare Erklärung, das macht Sinn. Folgendes hat mir geholfen, den Unterschied zu verstehen:
>>> a = [1 ,2, 3]
>>> b = a
>>> id(a) == id(b)
True
>>> a += [4, 5, 6] # list object is changed, no new object created
>>> id(a) == id(b)
True
>>> a = a + [4, 5, 6] # new object created, and assigned to `a`
>>> id(a) == id(b)
False
Wenn ich das richtig verstehe, ist die Tatsache, dass mit +=
kein neues Objekt erstellt wird, die Analogie zu out=a
.
Eine Möglichkeit, das Problem zu umgehen, besteht darin, dtype=float
bei der Array-Erstellung zu verwenden.
Korrekt.
Hilfreichster Kommentar
Ich gehe davon aus, dass Sie Python 3 verwenden. Dies ist das erwartete Verhalten von Python 3. Das Ergebnis von
a / 4
ist kein Integer-Array, sondern ein Gleitkomma-Array. Wenn Sie dieses Ergebnis einfach mit der Zeilea = a / 4
, ist das in Ordnung. Es wandelt den Code im Wesentlichen ina = np.true_divide(a, 4)
, wodurch ein neues Gleitkomma-Array erstellt und ihm der Namea
zugewiesen wird.Wenn Sie versuchen, eine direkte Zuweisung durchzuführen, wird die
true_divide
ufunc aufgefordert, wieder in das vorhandenea
Integer-Array auszugeben:np.true_divide(a, 4, out=a)
. Es gibt keine Implementierung vontrue_divide
, die zwei ganzzahlige Argumente akzeptiert und eine andere ganze Zahl ausgibt, sodass Sie die Ausnahme erhalten.