【问题标题】:Is there a function in Python which gives an output based on a probability distribution?Python中有一个函数可以根据概率分布给出输出吗?
【发布时间】:2019-03-26 13:58:59
【问题描述】:

我有一个数字数组,比如从 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.])

这是我尝试以我之前描述的方式获取一个索引(度数)的代码

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,但我不知道这个过程在概率上是否正确。你说什么?

【问题讨论】:

  • random.choice(&lt;original_array&gt;) 会根据出现的次数自动加权。
  • random.choices 允许您为特定项目分配权重,而不必用重复的值人为地扩大数组。

标签: python random probability


【解决方案1】:

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

正如 cmets 中所指出的,您还可以选择使用 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)

要从x 转到yz,请使用collections.Counter

 c = collections.Counter(x)
 y, z = map(list, zip(*c.items()))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 2011-10-27
    • 2021-12-01
    • 2017-12-20
    • 2019-02-26
    • 1970-01-01
    相关资源
    最近更新 更多