Python中是否有一个函数可以根据概率分布给出输出?

问题描述 投票:0回答:1

我有一个数字数组,比如从0到8,这可能在数组中重复出现。我需要在这些中选择一个数字,并且数字出现的概率应该与它在该数组中出现的次数成比例。

这是原始阵列:([7, 0, 7, 8, 4, 4, 6, 5, 2, 6, 0, 1, 2, 3, 4, 5, 6, 7, 8])

这是包含每个数字出现在数组中的次数的数组: array([ 2., 1., 3., 1., 1., 4., 1., 5., 1.])

这是我尝试以前面描述的方式得到一个索引(deg)的代码

tot = sum((deg))
n = np.random.uniform(0, tot)
for i in range(len(deg)):
    if n < deg[i]:
        return i
    n = n - deg[i]
return i

我得到一个索引,2,但我不知道这个过程是否可能是正确的。你说什么?

python random probability
1个回答
2
投票

您可以在原始输入上使用random.choice。选择元素的概率将自动与出现的数量成比例,因为所选索引是均匀分布的。无需计算deg

正如评论中所指出的,您还可以选择使用random.choices,它不仅允许您使用替换来收集多个样本,还允许您手动分配每个元素的比例。

例如,以下三个输入应为给定种子选择相同的三个元素:

 x = [1, 2, 3, 2, 7, 7, 7, 7]
 y = [1, 2, 3, 7]
 z = [1, 2, 1, 4]
 w = [0.125, 0.25, 0.125, 0.5]

 random.choices(x, k=3)
 random.choices(y, weights=z, k=3)
 random.choices(y, weights=w, k=3)

要从xyz,请使用collections.Counter

 c = collections.Counter(x)
 y, z = map(list, zip(*c.items()))
© www.soinside.com 2019 - 2024. All rights reserved.