Począwszy od Pythona v3.6
, random.choices
można go użyć do zwrócenia list
elementów o określonym rozmiarze z danej populacji z opcjonalnymi wagami.
random.choices(population, weights=None, *, cum_weights=None, k=1)
populacja : list
zawierająca unikalne obserwacje. (Jeśli pusty, podnosi IndexError
)
wagi : Aby dokonać selekcji, wymagane są bardziej dokładne wagi względne.
cum_weights : skumulowane wagi wymagane do dokonania selekcji.
k : rozmiar ( len
), list
który ma być wyprowadzony. (Domyślnie len()=1
)
Kilka ostrzeżeń:
1) Wykorzystuje ważenie próbkowania z wymianą, aby narysowane elementy zostały później zastąpione. Wartości w sekwencji wag same w sobie nie mają znaczenia, ale ich względny stosunek ma znaczenie.
W przeciwieństwie do tego, np.random.choice
który może przyjmować jedynie prawdopodobieństwa jako wagi, a także który musi zapewniać sumowanie indywidualnych prawdopodobieństw do 1 kryteriów, nie ma tutaj takich przepisów. Tak długo, jak należą do typów numerycznych ( int/float/fraction
oprócz Decimal
typu), będą one nadal działać.
>>> 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) Jeśli nie podano ani wag, ani cum_weights , wyborów dokonuje się z jednakowym prawdopodobieństwem. Jeśli podano sekwencję wag , musi ona być tej samej długości co sekwencja populacji .
Określenie zarówno wag, jak i cum_weights podnosi a TypeError
.
>>> random.choices(["white", "green", "red"], k=10)
['white', 'white', 'green', 'red', 'red', 'red', 'white', 'white', 'white', 'green']
3) Cum_wagi są zazwyczaj wynikiem itertools.accumulate
funkcji, które są naprawdę przydatne w takich sytuacjach.
Z powiązanej dokumentacji:
Wewnętrznie wagi względne są konwertowane na wagi skumulowane przed dokonaniem selekcji, więc podanie skumulowanych wag oszczędza pracę.
Zatem dostarczanie weights=[12, 12, 4]
lub cum_weights=[12, 24, 28]
w naszym przemyślanym przypadku daje ten sam rezultat, a ten drugi wydaje się być szybszy / bardziej wydajny.
random.choices
przypadku pojedynczych połączeń. Jeśli potrzebujesz wielu losowych wyników, bardzo ważne jest, aby wybrać je wszystkie jednocześnie, dostosowującnumber_of_items_to_pick
. Jeśli to zrobisz, będzie to rząd wielkości szybszy.