У меня есть несколько массивов со значениями, которые выглядят следующим образом:

po_freq1 = [0.01408451 0.05633803 0.14084507 0.02816901 0.01408451 0.01408451
0.05633803 0.05633803 0.01408451 0.01408451 0.01408451 0.01408451
0.02816901 0.07042254 0.01408451 0.01408451 0.04225352 0.11267606
0.04225352 0.01408451 0.04225352 0.02816901 0.01408451 0.04225352
0.05633803 0.01408451 0.01408451 0.01408451]

Моя цель состоит в том, чтобы случайным образом выбрать некоторые значения из моего массива и суммировать эти значения, пока не будет достигнуто заданное значение, например 0,90. У кого-нибудь есть идея?

1
Zara Arshad 17 Сен 2018 в 18:12

2 ответа

Лучший ответ

Используя случайный пакет и цикл while

import random
po_freq1 = [0.01408451, 0.05633803, 0.14084507, 0.02816901, 0.01408451, 0.01408451,
0.05633803, 0.05633803, 0.01408451, 0.01408451, 0.01408451, 0.01408451,
0.02816901, 0.07042254, 0.01408451, 0.01408451, 0.04225352, 0.11267606,
0.04225352, 0.01408451, 0.04225352, 0.02816901, 0.01408451, 0.04225352,
0.05633803, 0.01408451, 0.01408451, 0.01408451]

sumv = 0.
while sumv<0.9: sumv += random.choice(po_freq1)
print (sumv)
0
Algopark 17 Сен 2018 в 16:07

Вы можете использовать cumsum и argmin, перемешать массив, чтобы сделать выбор случайным:

arr = np.array([0.87868619, 0.08184167, 0.01502171, 0.96840561, 0.31431041,
       0.531577  , 0.66069971, 0.1204876 , 0.9684556 , 0.81405872,
       0.48118081, 0.91681978, 0.15017044, 0.50540813, 0.11617046,
       0.01897202, 0.1894475 , 0.94660911, 0.46030856, 0.04641654])
np.random.shuffle(arr)

Для порога 5, например:

>>> (np.cumsum(arr)<=5).argmin()
11

Это дает вам индекс, где вы должны остановить суммирование. Это будет быстрее, чем цикл while, поскольку операции векторизованы.

In [38]: np.sum(arr[:11])
Out[38]: 4.15852117

In [39]: np.sum(arr[:12])
Out[39]: 5.126976770000001
1
user3483203 17 Сен 2018 в 16:18