[PYTHON] [Histoire d'échec] Quand j'ai ajouté 1 à ndarray, dtype a changé involontairement.

supposition

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

Bug (échec)

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

Solution

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])

De côté

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.

Recommended Posts

[Histoire d'échec] Quand j'ai ajouté 1 à ndarray, dtype a changé involontairement.
Ce à quoi j'ai fait référence en étudiant tkinter
Une histoire à laquelle j'étais accro après la communication SFTP avec python