我希望生成一个大小为N的随机数组,仅包含0和1,我希望我的数组在0和1之间有一些比例关系。例如,90%的数组是1,剩下的10%是0(我希望这90%连同整个数组都是随机的)。
目前我有:
randomLabel = np.random.randint(2, size=numbers)
但是我无法控制0和1之间的比率。
目前我有:
randomLabel = np.random.randint(2, size=numbers)
但是我无法控制0和1之间的比率。
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)
np.random.binomial(n=1, p=0.9, size=[1000])
如果不使用numpy,可以按照以下方式进行:
最初的回答
import random
percent = 90
nums = percent * [1] + (100 - percent) * [0]
random.shuffle(nums)
很难得到精确的计数,但您可以假设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
最近我需要做一个压缩实验,其中需要类似的操作。我将代码发布出来,以便下一个谷歌搜索这个问题的人可以生成[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()