J'ai une gamme de probabilités d'élément, disons 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é. P> J'ai proposé ceci: p> Ça marche, mais c'est trop compliqué, il doit y avoir une meilleure façon. Merci. P> p> [0,1, 0,2, 0,5, 0,2] code>. La matrice résume jusqu'à 1.0.
5 Réponses :
In [27]: cutoffs.searchsorted(0.9723114393023948) Out[27]: 3
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
Utiliser numpy.random.multinomial code> - le plus efficace p>
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