生成特定比例的0和1随机数组

26
我希望生成一个大小为N的随机数组,仅包含0和1,我希望我的数组在0和1之间有一些比例关系。例如,90%的数组是1,剩下的10%是0(我希望这90%连同整个数组都是随机的)。

目前我有:

randomLabel = np.random.randint(2, size=numbers)

但是我无法控制0和1之间的比率。


1
你想要精确的1:9比例还是每个单元格都有独立的10%概率为0? - user2357112
两个都可以,我觉得。 - Am1rr3zA
请参考以下链接:https://dev59.com/CmIk5IYBdhLWcg3wFKpK - Warren Weckesser
5个回答

58
如果你想要一个精确的1:9比例:
nums = numpy.ones(1000)
nums[:100] = 0
numpy.random.shuffle(nums)

如果您想要独立的10%概率:

nums = numpy.random.choice([0, 1], size=1000, p=[.1, .9])
或者
nums = (numpy.random.rand(1000) > 0.1).astype(int)

10
你可以使用二项分布:
np.random.binomial(n=1, p=0.9, size=[1000])

2

如果不使用numpy,可以按照以下方式进行:

最初的回答

import random
percent = 90

nums = percent * [1] + (100 - percent) * [0]
random.shuffle(nums)

1

很难得到精确的计数,但您可以假设random.random返回一个均匀分布来得到近似答案。这并不严格正确,只是大致如此。如果您真正拥有均匀分布,则可能会成功。您可以尝试像以下这样的方法:

In [33]: p = random.random(10000)
In [34]: p[p <= 0.1] = 0
In [35]: p[p > 0] = 1
In [36]: sum(p == 0)
Out[36]: 997
In [37]: sum(p == 1)
Out[37]: 9003

希望这有所帮助...

0

最近我需要做一个压缩实验,其中需要类似的操作。我将代码发布出来,以便下一个谷歌搜索这个问题的人可以生成[n]个随机字节,并且给定零和一的比例。

import random

from bitstring import BitArray


def get_by_fives():
    for i in range(60, 100, 5):
        percent_0 = i
        percent_1 = 100-i
        set_count = 0
        ba = BitArray(8388608) # 1MB
        for j in range(0, len(ba)):
            die_roll = random.randint(0, 100)
            set = die_roll > percent_0
            if set:
                ba.set(True, j)
                set_count +=1
        file_name = "{}_percent_bits_set".format(percent_1, percent_0)
        print("writing {} with set_count {} to disk".format(file_name, set_count))
        with open(file_name, 'wb') as f:
            ba.tofile(f)



if __name__ == "__main__":
    get_by_fives()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接