Dato a
, un array di interi positivi, è' Prima di tutto è necessario calcolare la frequenza di ogni intero. Ad esempio, utilizzando 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
ti dice la frequenza di ogni intero in a
. Il corrispondente set di pesi è quindi l'array b/len(a)
. Utilizzando np.random.choice
con questi pesi e replace=False
dovrebbe quindi dare quello che ti serve:
>>> 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])
Se non stai lavorando solo con numeri interi positivi, o se si lavora con grandi numeri interi positivi, @ user2357112 sottolinea nei commenti sotto che np.unique
fornisce un'altra soluzione. Qui scrivi:
>>> 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])
Cosa intendi senza ripetizione? In ciò non conserva i pesi. Intendi senza ripetizione dell'indice? –
La tua domanda non è chiara, ma se intendi ciò che penso intendi, ecco un duplicato: http://stackoverflow.com/questions/10803135/weighted-choice-short-and-simple –
stai cercando 'np .random.choice (list (set (a)), size = 5, replace = False) '? – EdChum