0
votes

Imprimer les éléments d'une liste en fonction des probabilités dans la boucle for

Basé sur les probabilités de p, si p Par exemple:

['A', 'E']
['C', 'D', 'E']
['A']
['A', 'C']
['E']

La sortie est :

[ 0.46565909  0.741431    0.65590764  0.87347741  0.38465195]
[ 0.62172525  0.80688763  0.40391766  0.28042554  0.34544989]
[ 0.00138961  0.56959351  0.69043625  0.59473154  0.84042555]
[ 0.18535428  0.63470281  0.27882709  0.78731892  0.63624727]
[ 0.89383216  0.72008758  0.66048462  0.94064897  0.1484418 ] 

Donc, en fonction des probabilités, j'aimerais que ma sortie soit:

for i in range(5):
    list1 = ['A', 'B', 'C', 'D', 'E']
    p = np.random.uniform(low= 0.0, high= 1.0, size=5)
    print(p)


2 commentaires

si p <0.5: print (list1 [i]) ?


eh bien, la probabilité signifie que vous n'aurez pas cette sortie ... mais que vous pouvez avoir cette sortie ...


4 Réponses :


3
votes

Utilisez np.where pour obtenir les indices dont les valeurs sont inférieures à 0,5, puis imprimez ces éléments:

for i in range(5):
    list1 = ['A', 'B', 'C', 'D', 'E']
    mask = np.where(np.random.uniform(low= 0.0, high= 1.0, size=5) < 0.5)
    print([list1[i] for i in mask[0]])

#output (The output is stochastic meaning they will change on each iteration unless you use fixed random state)
['C']
['A', 'B', 'C', 'E']
['D', 'E']
['A', 'C', 'D']
['B', 'C', 'E']


0 commentaires

0
votes

Une façon de résoudre ce problème est avec np.where, comme suggéré dans une autre réponse ici.

Alternativement, dans le style de la programmation fonctionnelle, filtrez la liste de lettres par une fonction qui "lance la pièce", à savoir:

(letter for letter in list1 if np.random.uniform() < 0.5)

Ou, de manière équivalente:

filter(lambda letter: np.random.uniform() < 0.5, list1)


0 commentaires

1
votes

vous pouvez appliquer directement moins que l'opérateur si vous changez votre liste en tableau numpy

['C']
['A' 'D']
['A' 'B' 'C' 'D']
['A' 'B' 'E']
['A' 'B' 'D']

Sortie:

XXX


0 commentaires

1
votes

Juste une autre option:

[ [l for r, l in zip(np.random.uniform(low= 0.0, high= 1.0, size=5), list1) if r > 0.5] for i in range(5) ]

#=> [['A'], ['D', 'E'], ['B', 'C'], ['D'], ['B', 'C', 'E']]


0 commentaires