如何确保列表内容总是总计为1?

时间:2017-06-09 23:28:38

标签: python arrays numpy random probability

我正在尝试一个概率列表,我必须在新元素加入时一直更新。我的代码是:

sum=7
my_list = [2,2,2,1]
prob_list = list(map(lambda x: float(x/sum), my_list))

哪个收益率:

>>prob_list
[0.2857142857142857, 0.2857142857142857, 0.2857142857142857, 0.14285714285714285]

当我检查prob_list元素的总和时,它总计达到1:

0,2857142857142857+ 0,2857142857142857+ 0,2857142857142857+0,14285714285714285 = 1

但是,当我在numpy.random.choice中使用此文件时,它会通过说概率不等于1来引发错误:

k = choice(my_list, size=1,replace=False, p=prob_list)[0]

错误是:

k = choice(my_list,size = 1,replace = False,p = prob_list)[0]文件“mtrand.pyx”,第1130行,mtrand.RandomState.choice(numpy / random / mtrand / mtrand.c:17766)

ValueError:概率不等于1

您知道错误的原因以及如何解决?

1 个答案:

答案 0 :(得分:0)

您的所有证据都表明此功能的numpy实现已被破坏。几乎可以肯定,由于浮点舍入,这种情况可能会在您尝试将一堆浮点数添加到一起并且期望它精确到整数(整数)时发生。回溯表明函数本身是用C语言编写的,也许从C到Python的转换又回来引入了另一种累积错误的方法。解决方案是忘记numpy并在python中编写函数,如下所示:

import random

def choice(x):
    r = random.randrange(sum(x))
    for a in x:
        r -= a
        if r < 0:
            return a

my_list = [11, 4, 2, 2, 1]  

for _ in range(10):
    print(choice(my_list))

此例程假定您已提供了一个int列表,并避免了所有浮点算法。

是的,我不知道为什么这个问题被低估了。这对我来说似乎是个好问题。