A partire da Python v3.6
, random.choices
potrebbe essere usato per restituire uno list
di elementi di dimensioni specificate dalla popolazione data con pesi opzionali.
random.choices(population, weights=None, *, cum_weights=None, k=1)
popolazione : list
contenente osservazioni uniche. (Se vuoto, solleva IndexError
)
pesi : pesi relativi più precisamente necessari per effettuare le selezioni.
cum_weights : pesi cumulativi necessari per effettuare le selezioni.
k : size ( len
) list
dell'output. (Impostazione predefinita len()=1
)
Pochi avvertimenti:
1) Si avvale di campionamento ponderato con sostituzione in modo che gli elementi estratti vengano successivamente sostituiti. I valori nella sequenza dei pesi in sé non contano, ma il loro rapporto relativo è importante.
A differenza di ciò np.random.choice
che può assumere solo le probabilità sotto forma di pesi e che deve garantire la somma delle probabilità individuali fino a 1 criterio, non esistono norme di questo tipo. Fintanto che appartengono a tipi numerici ( int/float/fraction
tranne il Decimal
tipo), questi funzionerebbero comunque.
>>> import random
# weights being integers
>>> random.choices(["white", "green", "red"], [12, 12, 4], k=10)
['green', 'red', 'green', 'white', 'white', 'white', 'green', 'white', 'red', 'white']
# weights being floats
>>> random.choices(["white", "green", "red"], [.12, .12, .04], k=10)
['white', 'white', 'green', 'green', 'red', 'red', 'white', 'green', 'white', 'green']
# weights being fractions
>>> random.choices(["white", "green", "red"], [12/100, 12/100, 4/100], k=10)
['green', 'green', 'white', 'red', 'green', 'red', 'white', 'green', 'green', 'green']
2) Se non vengono specificati né pesi né cum_weights , le selezioni vengono effettuate con uguale probabilità. Se viene fornita una sequenza di pesi , deve avere la stessa lunghezza della sequenza di popolazione .
Specificare sia pesi che cum_weights aumenta a TypeError
.
>>> random.choices(["white", "green", "red"], k=10)
['white', 'white', 'green', 'red', 'red', 'red', 'white', 'white', 'white', 'green']
3) i cum_weights sono in genere il risultato di una itertools.accumulate
funzione che è davvero utile in tali situazioni.
Dalla documentazione collegata:
Internamente, i pesi relativi vengono convertiti in pesi cumulativi prima di effettuare le selezioni, quindi fornire i pesi cumulativi consente di risparmiare lavoro.
Quindi, fornire weights=[12, 12, 4]
o cum_weights=[12, 24, 28]
per il nostro caso inventato produce lo stesso risultato e quest'ultimo sembra essere più veloce / efficiente.
random.choices
alle singole chiamate. Se hai bisogno di molti risultati casuali, è davvero importante sceglierli tutti in una volta regolandolinumber_of_items_to_pick
. Se lo fai, è un ordine di grandezza più veloce.