特定の割合の0と1の乱数を生成する効率的な(おそらくMatlabの用語でベクトル化された)方法は何ですか?特にNumpyで?
私のケースは 1/3
のための特別なので、私のコードはそうです。
import numpy as np
a=np.mod(np.multiply(np.random.randomintegers(0,2,size)),3)
しかし、少なくともKとNが自然数であるK/N
の状況では、これをより効率的に処理できる組み込み関数があるのでしょうか?
これを行う簡単な方法は、まずゼロと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
して、ランダムな分布にすればよいのです。
>>> 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の正確な割合を与えることに注意してください。もし正確な割合が必要でないのなら、二項法がうまくいくでしょう。
もし私があなたの問題を正しく理解していれば、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.])