具有特定比例的二进制随机数组?

时间:2013-10-25 18:56:14

标签: python arrays random numpy random-sample

有效(可能是使用Matlab术语矢量化)生成随机数的零和具有特定比例的零的方法是什么?特别是Numpy?

由于我的案例特别针对1/3,我的代码是:

import numpy as np 
a=np.mod(np.multiply(np.random.randomintegers(0,2,size)),3)

但是有没有任何内置函数可以更有效地处理这个问题,至少对于K/N K和N是自然数的情况呢?

6 个答案:

答案 0 :(得分:56)

另一种方法,使用np.random.choice

>>> np.random.choice([0, 1], size=(10,), p=[1./3, 2./3])
array([0, 1, 1, 1, 1, 0, 0, 0, 0, 0])

答案 1 :(得分:19)

一种简单的方法是首先生成一个ndarray,其中包含零和你想要的比例:

>>> import numpy as np
>>> N = 100
>>> K = 30 # K zeros, N-K ones
>>> arr = np.array([0] * K + [1] * (N-K))
>>> arr
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1])

然后你可以shuffle数组,使分布随机:

>>> np.random.shuffle(arr)
>>> arr
array([1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0,
       1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1,
       1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
       0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1,
       1, 1, 1, 0, 1, 1, 1, 1])

请注意,此方法将为您提供所请求的零/一个精确比例,这与二项式方法不同。如果你不需要确切的比例,那么二项式方法就可以了。

答案 2 :(得分:15)

您可以使用numpy.random.binomial。例如。假设frac是1的比例:

In [50]: frac = 0.15

In [51]: sample = np.random.binomial(1, frac, size=10000)

In [52]: sample.sum()
Out[52]: 1567

答案 3 :(得分:4)

如果我正确理解您的问题,您可能会获得numpy.random.shuffle

的帮助
>>> def rand_bin_array(K, N):
    arr = np.zeros(N)
    arr[:K]  = 1
    np.random.shuffle(arr)
    return arr

>>> rand_bin_array(5,15)
array([ 0.,  1.,  0.,  1.,  1.,  1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,
        0.,  0.])

答案 4 :(得分:0)

简单的一线式:您可以避免使用整数列表和概率分布列表,因为我认为对于这个问题而言,这是不直观且过大的,只需先处理@mixin iconSize($size){ &[size="#{$size}"]{ width: 24px*$size; height: 24px*$size; svg{ transform: scale($size); transform-origin: left top; } } } ,然后转换为{{1} }(如果需要,尽管可以将其保留为bool数组)。

int

答案 5 :(得分:0)

获取精确的1和0数的另一种方法是使用np.random.choice对索引进行采样而不进行替换:

arr_len = 30
num_ones = 8

arr = np.zeros(arr_len, dtype=int)
idx = np.random.choice(range(arr_len), num_ones, replace=False)
arr[idx] = 1

出局:

arr

array([0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1,
       0, 0, 0, 0, 0, 1, 0, 0])
相关问题