numpy 二进制随机数组与特定比例的1?

pes8fvy9  于 12个月前  发布在  其他
关注(0)|答案(7)|浏览(139)

什么是有效的(可能是用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是自然数?

polkgigr

polkgigr1#

还有一种方法,使用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])

字符串

tv6aics1

tv6aics12#

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

>>> 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])


请注意,这种方法将给予您所要求的0/1的 * 精确比例 *,而不像二项式方法。如果您不需要精确比例,那么二项式方法也可以正常工作。

fivyi3re

fivyi3re3#

如果我对您的问题理解正确,您可能会得到一些有关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.])

字符串

weylhg0b

weylhg0b4#

你可以使用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

字符串

64jmpszr

64jmpszr5#

另一种获得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])

k5ifujac

k5ifujac6#

简单的一行程序:你可以避免使用整数和概率分布的列表,在我看来,这对这个问题来说是不直观和矫枉过正的,只需先处理bool s,然后在必要时转换为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])

字符串

um6iljoc

um6iljoc7#

您可以通过以下方法直接在一行中生成具有随机二进制成员(0和1)的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]])
>>

字符串

相关问题