在python中生成具有加权概率的随机数

cca*_*cho 5 python arrays numpy probability

给定一个正整数数组a,目标是根据它们在数组中的权重生成5个随机数.

例如:

a = [2,3,4,4,4,4,4,6,7,8,9]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,数字4出现了5次,在这种情况下,数字4应该出现5/11的概率.

不应该重复数字.

Ale*_*ley 5

给定a一个正整数数组,首先需要计算每个整数的频率.例如,使用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)
Run Code Online (Sandbox Code Playgroud)

b告诉你每个整数的频率a.因此,相应的权重集是阵列b/len(a).使用np.random.choice这些重量,replace=False然后应该给你你需要的:

>>> 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])
Run Code Online (Sandbox Code Playgroud)

如果你不使用正整数,或者你正在处理大的正整数,@ user2357112在下面的注释中指出np.unique了另一种解决方案.在这里你写道:

>>> 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])
Run Code Online (Sandbox Code Playgroud)