7
votes

Dessinez un élément aléatoire dans NUMPY

J'ai une gamme de probabilités d'élément, disons [0,1, 0,2, 0,5, 0,2] . La matrice résume jusqu'à 1.0.

Utilisation de python ordinaire ou de Numpy, je tiens à dessiner des éléments proportionnels à leur probabilité: le premier élément d'environ 10% du temps, deuxième 20%, troisième 50%, etc. Le "tirage" devrait Indice de retour de l'élément tiré.

J'ai proposé ceci: xxx

Ça marche, mais c'est trop compliqué, il doit y avoir une meilleure façon. Merci.


0 commentaires

5 Réponses :


9
votes
In [27]: cutoffs.searchsorted(0.9723114393023948)
Out[27]: 3

0 commentaires

0
votes

Je n'ai jamais utilisé numpy, mais je suppose que mon code ci-dessous (Python seulement) fait la même chose que ce que vous avez accompli dans une ligne. Je le pose ici au cas où vous le voudriez.

a l'air très c-ish tellement excuses pour ne pas être très pythonique. P>

poids_total serait 1 pour vous. P>

def draw(probs)
    r = random.randrange(weight_total)
    running_total = 0
    for i, p in enumerate(probs)
        running_total += p
        if running_total > r:
            return i


0 commentaires

0
votes

Utilisez bisect xxx

devrait faire le tour.


0 commentaires

1
votes

Utiliser numpy.random.multinomial - le plus efficace


0 commentaires

4
votes

Vous souhaitez échantillonner de la distribution catégorique, qui n'est pas implémentée dans NUMPY. Cependant, le La distribution multinomiale est une généralisation du catégorique distribution et peut être utilisé à cet effet.

>>> import numpy as np
>>> 
>>> def sampleCategory(p):
...     return np.flatnonzero( np.random.multinomial(1,p,1) )[0]
... 
>>> sampleCategory( [0.1,0.5,0.4] )
1


0 commentaires