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

Cup*_*tor 50 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)
Run Code Online (Sandbox Code Playgroud)

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

Jai*_*ime 67

另一种方法,使用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])
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此方法*不会*给出您所要求的零和零的确切比例...下面的@mdml的答案会. (6认同)

mdm*_*dml 21

一个简单的方法是首先生成一个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])
Run Code Online (Sandbox Code Playgroud)

然后你可以只是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])
Run Code Online (Sandbox Code Playgroud)

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


Abh*_*jit 20

如果我正确理解你的问题,你可能会得到一些关于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.])
Run Code Online (Sandbox Code Playgroud)


War*_*ser 16

你可以用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
Run Code Online (Sandbox Code Playgroud)

  • 这并不能保证像 mdml 的答案那样的正确比例。 (2认同)