随机选择多选选项

2024-04-29 19:11:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从一组选项中选择多个项目。每个选项都有自己的一组被选中或未被选中的概率。你知道吗

福克斯示例:
选择,“是”、“否”
“九月”,0.90,0.10
“十月”,0.25,0.75
“十一月”,0.45,0.55
“十二月”,0.50,0.50

“是”表示被选中,“否”表示未选中。因此,对于第一卷,可以选择[“九月”、“十二月”],对于第二卷,可以选择[“九月”、“十月”、“十一月”]等等。你知道吗

它类似于复选框选项,其中选择或不选择一个选项独立于其他选项。你知道吗

我能挺过去numpy.random.choice选项通过循环进入每一个给定的选择。但我想知道有没有更优雅/有效的方法?你知道吗

我就是这么做的

choices = {
    "September":0.90,
    "October":0.25,
    "November":0.45,
    "December":0.50
}

resp = []
for ch, pr in choices:
    pick = 1
    probs = [pr, 1-pr]
    select = ["yes", "no"]
    choose = numpy.random.choice(select, pick, probs)
    if "yes" in choose[0]:
        resp.append(ch)

谢谢。你知道吗


Tags: 项目innumpy选项randomprchselect
1条回答
网友
1楼 · 发布于 2024-04-29 19:11:12

您可以使用numpy.random.uniform函数来生成间隔[0,1]中的样本。通过将这些概率与choices中的概率进行比较,可以创建具有指定概率的随机样本。由于自动广播,每一列都与choices对应的概率相比较。你知道吗

这样,您就可以创建一个维度为(n_rolls, n_choices)的矩阵,其中n_rolls是您希望重复此操作的次数(如果您只需要一个样本,则可以是1),而n_choices是不同选择的次数。你知道吗

import numpy
from collections import OrderedDict

choices = OrderedDict()
choices["September"] = 0.90
choices["October"] = 0.25
choices["November"] = 0.45
choices["December"] = 0.50

n_rolls = 5
probs = numpy.random.uniform(size=(n_rolls, len(choices)))
samples = probs < choices.values()

结果将是一个bool数组,其中每列对应于choices中的一个选项,每行包含一个try。由于我们使用了OrderedDict,结果的排序方式将与您输入字典数据的方式相同。你知道吗

>>> samples
array([[False, False, False, False],
       [ True,  True,  True, False],
       [ True, False, False, False],
       [ True, False,  True,  True],
       [ True, False,  True, False]], dtype=bool)

作为测试:让我们找出n_rolls=1000000每列的概率:

>>> numpy.mean(samples, axis=0)
array([ 0.899713,  0.249405,  0.449437,  0.499881])

要将此结果转换为指定的列表,可以使用numpy.wherenumpy.choose的组合:

res = numpy.choose(numpy.where(samples[0, :]), choices.keys())

print samples[0,:],'\n',res
[ True False  True  True] 
[['September' 'November' 'December']]

不幸的是,这个部分只适用于一行,所以如果您有多个转鼓,您需要在循环中完成最后一步。你知道吗

相关问题 更多 >