Вывести элементы списка на основе вероятностей в цикле for - PullRequest
0 голосов
/ 14 марта 2019

На основании вероятностей p, если p <0,5, я бы хотел взять буквы соответствующих позиций списка 1. </p>

Например:

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)

Вывод:

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

Итак, исходя из вероятностей, я бы хотел, чтобы мой результат был:

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

Ответы [ 4 ]

3 голосов
/ 14 марта 2019

Используйте np.where, чтобы получить индексы, значения которых меньше 0,5, а затем напечатайте эти элементы:

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']
1 голос
/ 14 марта 2019

Просто еще один вариант:

[ [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']]
1 голос
/ 14 марта 2019

Вы можете подать прямое меньше, чем оператор, если вы измените list на numpy array

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

Out:

['C']
['A' 'D']
['A' 'B' 'C' 'D']
['A' 'B' 'E']
['A' 'B' 'D']
0 голосов
/ 14 марта 2019

Один из способов решения этой проблемы - с помощью np.where, как предлагается в другом ответе здесь.

В качестве альтернативы, в стиле функционального программирования, отфильтруйте список писем с помощью функции, которая «подбрасывает монету», а именно:

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

Или, что эквивалентно:

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