Bogues rencontrés lors du développement de ma bibliothèque d'apprentissage améliorée cpprb (issue / 112))
Il s'agit d'une bibliothèque pour stocker temporairement des données pour Experience Replay de l'apprentissage amélioré, le type de données est spécifié par l'utilisateur dans le constructeur, et en interne [Numpy ndarray](https://numpy.org/doc/ Il a été enregistré sous le nom stable / reference / generated / numpy.ndarray.html).
L'autre jour, quand j'ai ajouté à ndarray avec un code comme celui-ci (strictement différent), il a changé en dtype sans le vouloir et le comportement est devenu étrange.
punaise
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.Ce n'est plus booléen!! np.int64
Même si vous utilisez numpy.add au lieu de l'opérateur «+», le type de sortie changera.
(Si la variable d'origine une fois stockée dans la destination de sortie ʻoutest spécifiée,
numpy.core._exceptions.UFuncTypeError: Impossible de convertir la sortie ufunc'add 'de dtype (' int64 ') en dtype (' bool ') avec la règle de conversion Je me fâche contre 'même_kind' '.)
En substituant le résultat du calcul pour chaque élément comme indiqué ci-dessous (uniquement lorsque le type peut être converti), le calcul peut être effectué tout en conservant le type d'origine.
Réparer
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])
Il y avait un autre but, et il m'est arrivé juste d'effectuer l'addition, et l'addition elle-même n'a aucune signification. (L'ajout de bool ... n'est pas le sujet principal de cet article.)
Jusqu'au dernier, l'histoire de l'échec selon laquelle le type a été involontairement converti lorsque l'opération au niveau de l'objet a été effectuée sur ndarray.