什么是有效的(可能是用Matlab术语矢量化的)方法来生成具有特定比例的0和1的随机数?特别是用Numpy?由于我的例子是1/3的特殊情况,我的代码是:
1/3
import numpy as np a=np.mod(np.multiply(np.random.randomintegers(0,2,size)),3)
字符串但是有没有内置函数可以更有效地处理这个问题,至少对于K/N的情况,其中K和N是自然数?
K/N
polkgigr1#
还有一种方法,使用np.random.choice:
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])
字符串
tv6aics12#
一个简单的方法是首先生成一个ndarray,其中包含你想要的0和1的比例:
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数组,使分布随机:
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的 * 精确比例 *,而不像二项式方法。如果您不需要精确比例,那么二项式方法也可以正常工作。
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.])
weylhg0b4#
你可以使用numpy.random.binomial。例如,假设frac是1的比例:
numpy.random.binomial
frac
In [50]: frac = 0.15 In [51]: sample = np.random.binomial(1, frac, size=10000) In [52]: sample.sum() Out[52]: 1567
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])
型
k5ifujac6#
简单的一行程序:你可以避免使用整数和概率分布的列表,在我看来,这对这个问题来说是不直观和矫枉过正的,只需先处理bool s,然后在必要时转换为int(尽管在大多数情况下将其保留为bool数组应该可以工作)。
bool
int
>>> 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])
um6iljoc7#
您可以通过以下方法直接在一行中生成具有随机二进制成员(0和1)的nd-array。您也可以使用np.random.random()代替np.random.uniform()。
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]]) >>
7条答案
按热度按时间polkgigr1#
还有一种方法,使用
np.random.choice
:字符串
tv6aics12#
一个简单的方法是首先生成一个
ndarray
,其中包含你想要的0和1的比例:字符串
然后你可以只
shuffle
数组,使分布随机:型
请注意,这种方法将给予您所要求的0/1的 * 精确比例 *,而不像二项式方法。如果您不需要精确比例,那么二项式方法也可以正常工作。
fivyi3re3#
如果我对您的问题理解正确,您可能会得到一些有关numpy.random.shuffle的帮助
字符串
weylhg0b4#
你可以使用
numpy.random.binomial
。例如,假设frac
是1的比例:字符串
64jmpszr5#
另一种获得1和0的确切数量的方法是使用
np.random.choice
对索引进行采样,而不进行替换:字符串
输出:
型
k5ifujac6#
简单的一行程序:你可以避免使用整数和概率分布的列表,在我看来,这对这个问题来说是不直观和矫枉过正的,只需先处理
bool
s,然后在必要时转换为int
(尽管在大多数情况下将其保留为bool
数组应该可以工作)。字符串
um6iljoc7#
您可以通过以下方法直接在一行中生成具有随机二进制成员(0和1)的
nd-array
。您也可以使用np.random.random()
代替np.random.uniform()
。字符串