A partire da Python v3.6, random.choicespotrebbe essere usato per restituire uno listdi elementi di dimensioni specificate dalla popolazione data con pesi opzionali.
random.choices(population, weights=None, *, cum_weights=None, k=1)
popolazione : listcontenente 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) listdell'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.choiceche 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/fractiontranne il Decimaltipo), 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.accumulatefunzione 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.choicesalle 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.