Numpy: Divisionszuweisungsoperator wirft Fehler auf, separate Divisions- und Zuweisungsarbeit

Erstellt am 9. Feb. 2018  ·  3Kommentare  ·  Quelle: numpy/numpy

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.

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 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.

Alle 3 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen