如何有效(可能使用Matlab术语进行向量化)地按特定比例生成随机数量的0和1?特别是使用Numpy?
由于我的情况对于1/3
很特殊,我的代码是:
import numpy as np
a=np.mod(np.multiply(np.random.randomintegers(0,2,size)),3)
但是是否有任何内置函数可以更有效地处理这种情况,至少对于 K/N
的情况,其中K和N是自然数?
如何有效(可能使用Matlab术语进行向量化)地按特定比例生成随机数量的0和1?特别是使用Numpy?
由于我的情况对于1/3
很特殊,我的代码是:
import numpy as np
a=np.mod(np.multiply(np.random.randomintegers(0,2,size)),3)
但是是否有任何内置函数可以更有效地处理这种情况,至少对于 K/N
的情况,其中K和N是自然数?
另一种方法是使用 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])
一个简单的方法是首先生成一个带有所需零和一比例的 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])
请注意,与二项式方法相比,此方法将为您提供所请求的零/一的精确比例。如果您不需要精确比例,则二项式方法也可以正常工作。
如果我正确理解你的问题,你可以通过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.])
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
bool
,然后根据需要转换为 int
(尽管保留为 bool
数组在大多数情况下也可行)。>>> import numpy as np
>>> np.random.random(9) < 1/3.
array([False, True, True, True, True, False, False, False, False])
>>> (np.random.random(9) < 1/3.).astype(int)
array([0, 0, 0, 0, 0, 1, 0, 0, 1])
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])
nd-array
。你也可以使用np.random.random()
代替np.random.uniform()
。>>import numpy as np
>>np.array([[round(np.random.uniform()) for i in range(3)] for j in range(3)])
array([[1, 0, 0],
[1, 1, 1],
[0, 1, 0]])
>>