python - 具有自定义概率分布的随机索引

标签 python numpy random distribution

我有一个概率向量(当然总和为 1):

prob = [0.1, 0.3, 0.4, 0.2]

现在我需要为这个向量生成一个随机索引(包括 0 到 3 之间的数字),但我希望每个索引的概率由 prob 给出

0 will be generated with prob 0.1
1 will be generated with prob 0.3
2 will be generated with prob 0.4
3 will be generated with prob 0.2

我知道我可以通过计算 cumsum 来做到这一点

cumsum = [0.1, 0.4, 0.8, 1.0]

然后生成一个0到1之间的随机数:

rand_num = np.random.random()

最后使用np.digitize检查我的随机数落入哪个垃圾箱。

idx = np.digitize([rand_num], cumsum)

这很有效,我对此很满意,digitize 甚至接受数字列表并将它们分类到容器中,因此我可以创建自己的函数来生成给定概率分布的索引。

我的问题是:这是一个常见问题,那么是否已经存在一个函数可以做到这一点? (这比我自己做更有效率)

谢谢

最佳答案

您可以使用 Python 3.6 中的 random.choices 来实现此目的,其中包含一个 weights 参数:

>>> from random import choices
>>> prob = [0.1, 0.3, 0.4, 0.2]
>>> choices(range(len(prob)), weights=prob)
[2]
>>> choices(range(len(prob)), weights=prob)
[3]
>>> choices(range(len(prob)), weights=prob, k=4)
[1, 2, 2, 2]

关于python - 具有自定义概率分布的随机索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50643760/

相关文章:

python - Numpy 切片多维错误产生意外结果

r - 随机的矢量化并行选择?

python - 如果在python中参数为None,如何打印默认值

python - 用较小的数组替换较大的 numpy 数组中的值

python - PySpark:根据值中的字符列出列名称

python - 数组 dtype ('|S58' 中竖线的含义是什么)

python - IO 错误 [Errno 2]

C# 随 secret 码生成器

python - pydrive上传文件400 "Bad Request"

python - 用于比较矩阵中的值的 ValueError