Fehler bei der Entwicklung meiner erweiterten Lernbibliothek cpprb (Problem / 112))
Es handelt sich um eine Bibliothek zum vorübergehenden Speichern von Daten für Experience Replay des erweiterten Lernens. Der Datentyp wird vom Benutzer im Konstruktor und intern Numpy's ndarray angegeben. Es wurde als stabil / Referenz / generiert / numpy.ndarray.html gespeichert.
Als ich neulich mit einem Code wie diesem (streng anders) zu ndarray hinzufügte, änderte sich dieser unbeabsichtigt in dtype und das Verhalten wurde seltsam.
Fehler
import numpy as np
def create_buffer(shape,dtype):
return np.zeros(shape=shape,dtype=dtype) + 1
create_buffer(1,np.bool) # array([1]) np.Es ist nicht mehr bool!! np.int64
Selbst wenn Sie numpy.add anstelle des Operators "+" verwenden, ändert sich der Ausgabetyp.
(Wenn Sie die ursprüngliche Variable angeben, die einmal im Ausgabeziel out
gespeichert wurde, numpy.core._exceptions.UFuncTypeError: Die Ausgabe von ufunc'add 'von dtype (' int64 ') kann mit der Casting-Regel nicht in dtype (' bool ') umgewandelt werden Ich werde wütend auf'same_kind'
.)
Durch Ersetzen des Berechnungsergebnisses für jedes Element wie unten gezeigt (nur wenn der Typ konvertiert werden kann) kann die Berechnung unter Beibehaltung des ursprünglichen Typs durchgeführt werden.
Fix
import numpy as np
def create_buffer(shape,dtype):
a = np.zeros(shape=shape,dtype=dtype)
a[:] = a + 1
return a
create_buffer(1,np.bool) # array([True])
Es gab einen anderen Zweck, und ich habe gerade die Addition durchgeführt, und die Addition selbst hat keine Bedeutung. (Das Hinzufügen von bool ... ist nicht das Hauptthema dieses Artikels.)
Bis zuletzt die Fehlergeschichte, dass der Typ unbeabsichtigt konvertiert wurde, als die Operation auf Objektebene auf ndarray ausgeführt wurde.