Biorąc a
, tablicę liczb całkowitych dodatnich, ty” Najpierw musisz obliczyć częstotliwość każdej liczby całkowitej. Na przykład za pomocą bincount
:
>>> a = [2,3,4,4,4,4,4,4,5,6,7,8,9,4,9,2,3,6,3,1]
>>> b = np.bincount(a)
b
informuje częstotliwość każdej liczby całkowitej w a
. Odpowiedni zestaw odważników jest zatem tablicą b/len(a)
. Korzystanie np.random.choice
z tymi ciężarami i replace=False
powinien wtedy dać ci to, czego potrzebujesz:
>>> np.random.choice(np.arange(len(b)), 5, p=b/len(a), replace=False)
array([5, 9, 4, 3, 8])
>>> np.random.choice(np.arange(len(b)), 5, p=b/len(a), replace=False)
array([7, 4, 6, 9, 1])
>>> np.random.choice(np.arange(len(b)), 5, p=b/len(a), replace=False)
array([3, 7, 4, 9, 6])
Jeśli nie pracujesz tylko z liczb całkowitych dodatnich, lub jeśli pracujesz z dużych liczb całkowitych dodatnich, @ user2357112 zwraca uwagę w komentarzach poniżej to np.unique
zapewnia inne rozwiązanie. Tutaj piszesz:
>>> choices, counts = np.unique(a, return_counts=True)
>>> np.random.choice(choices, 5, p=counts/len(a), replace=False)
array([9, 8, 2, 4, 5])
Co masz na myśli bez powtórzeń? W tym może nie zachowuje wagi. Masz na myśli bez powtarzania indeksu? –
Twoje pytanie nie jest całkiem jasne, ale jeśli masz na myśli to, co myślę, masz na myśli, oto duplikat: http://stackoverflow.com/questions/10803135/weighted-choice-short-and-simple –
czy po "np .random.choice (list (set (a)), size = 5, replace = False) '? – EdChum