Numpy: np.random.choice renvoie un index hors plage sur un tableau masqué prob.

Créé le 15 août 2020  ·  6Commentaires  ·  Source: numpy/numpy

import numpy as np

a = np.array([0.1, 0.2, 0.4, 0.3])
masked_a = np.ma.masked_array(a, [0, 0, 1, 1])
counter = np.zeros(len(a) + 1)
while True:
    action = np.random.choice(len(a), p=masked_a)
    counter[action] += 1
    print(counter / counter.sum())

# [0.09931198 0.20076697 0.         0.         0.69992105]

Il ne doit pas retourner un index> 3, mais lorsque le dernier élément du tableau masqué est vrai, il peut renvoyer index = 4

00 - Bug numpy.ma numpy.random

Tous les 6 commentaires

Le problème se produit également dans Generator.choice dans la version de développement de numpy:

In [1]: import numpy as np

In [2]: np.__version__ 
Out[2]: '1.20.0.dev0+986e533'

In [3]: rng = np.random.default_rng()

In [4]: pm = np.ma.masked_array([0.1, 0.2, 0.4, 0.3], mask=[0, 0, 1, 1])

In [5]: rng.choice(4, p=pm, size=12)
Out[5]: array([4, 4, 4, 0, 4, 1, 4, 0, 0, 4, 4, 4])

Plus tôt, j'ai ajouté l'étiquette «bug», mais c'est un jugement subjectif. Il y a d'autres fonctions dans numpy qui ne gèrent pas correctement les tableaux masqués (ou mieux, «correctement», puisque «l'exactitude» peut aussi être un jugement) où nous ne le considérons pas nécessairement comme un bogue. C'est peut-être juste un exemple de comportement indéfini, et la réponse courte au problème est "ne faites pas ça!". Ce serait plus agréable, cependant, si nous pouvions lever une exception au lieu de renvoyer des résultats absurdes.

Il serait assez facile d'ajouter une vérification explicite pour un tableau masqué et de générer une erreur si l'une des valeurs est réellement masquée, mais cela ressemble à une correction ad hoc très spécifique.

Est-ce que Generator.choice envoyé vers __array_function__ ? Si ce n'est pas le cas, c'est probablement le cas.

Si c'est le cas, alors je pense que nous ajoutons simplement ceci avec tous les autres "désintégrations de tableaux masqués parce que nous n'avons pas encore implémenté __array_function__ bogues

Plus tôt, j'ai ajouté l'étiquette «bug», mais c'est un jugement subjectif. Il y a d'autres fonctions dans numpy qui ne gèrent pas correctement les tableaux masqués (ou mieux, «correctement», puisque «l'exactitude» peut aussi être un jugement) où nous ne le considérons pas nécessairement comme un bogue. C'est peut-être juste un exemple de comportement indéfini, et la réponse courte au problème est "ne faites pas ça!". Ce serait plus agréable, cependant, si nous pouvions lever une exception au lieu de renvoyer des résultats absurdes.

Il serait assez facile d'ajouter une vérification explicite pour un tableau masqué et de générer une erreur si l'une des valeurs est réellement masquée, mais cela ressemble à une correction ad hoc très spécifique.

Je pense que s'il ne le gère pas correctement, il ne devrait pas permettre de passer un tableau masqué (devrait lever une exception) mais fonctionne correctement pour la plupart (cela fonctionne bien sauf dans certains cas). cela peut entraîner des problèmes potentiels pour l'environnement de production.

Il n'y a aucune utilisation de __array_function__ dans Generator . Alors que de nombreuses entrées obligent à se comporter correctement C contiguës, c'est probablement dans ce cas que certaines fonctions ne le forcent pas toujours assez religieusement.

Si vous ajoutez NPY_ARRAY_ENSUREARRAY alors vous vous retrouvez avec un ndarray qui est plein et ignore le masque. Difficile de dire que c'est «correct» à faire. Dans l'exemple de @WarrenWeckesser , cela finit par utiliser pm=np.array([.1,.2,.3,.4]) comme probabilités.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

dmvianna picture dmvianna  ·  4Commentaires

qualiaa picture qualiaa  ·  3Commentaires

Kreol64 picture Kreol64  ·  3Commentaires

perezpaya picture perezpaya  ·  4Commentaires

inducer picture inducer  ·  3Commentaires