numpy.random.choice関数は、既存の配列の要素から任意の確率分布で乱数を生成する関数です。このページでは、この関数について解説していきます。
重要
NumPyのversion1.17以降は、乱数操作には、関数は使わずにジェネレータメソッドを使うようになりました。最大の理由は、ジェネレータから乱数を生成する方が遥かに高速であり、科学技術計算に適しているからです。そのため現在では、random.choice関数ではなく、Generator.choiceメソッドの使用が推奨されています。『Generator.choice – 既存の配列から乱数配列を生成』で解説しています。
1. 書式
書き方:
np.random.choice(a, size=None, replace=True, p=None)
パラメーター:
a: 1-D array-like or int 配列(ndarray)を渡したら、その要素の中から乱数が生成される。数値(int)を渡したら、np.arange(a)から乱数が生成される。 |
size: int or tuple of ints, optional 出力する配列のshapeを指定する。デフォルト値のNoneでは、1つの値を返す。 |
replace: boolean, optional 値の重複を許すかどうか。デフォルト値のTrueでは値の重複があり、Falseでは値の重複がなし。 |
p: 1-D array_like, optional aの確率分布。指定しない場合は、一様分布としてみなす。 |
戻り値:
samples: single item or ndarray 乱数の配列、または1つの乱数 |
Raises:
ValueError ・aが0より小さい整数(int)の場合 ・aまたはpが1次元でない場合 ・aが size0 のarray_likeである場合 ・pが確率ベクトルでない場合 ・aとpの長さが異なる場合 ・replace=Falseで出力する乱数のsizeの方が大きい場合 |
一緒に確認したい関数:
- Generator.choice: 既存の配列から乱数配列を生成
- randint: 離散一様分布の整数の乱数配列を生成
- shuffle
- permutation
2. サンプルコード
次のコードではnp.arange(5)から、size3の一様分布の乱数を生成しています。なお、np.arangeは『numpy.arange – 色々な連番の配列を生成』で解説しています。
import numpy as np
np.random.choice(5, 3)
# >>> np.random.randint(0, 5, 3)と同じ
引数 p で確率分布を指定
引数 p= を指定することで、確率分布を操作することができます。関数に渡す配列の要素の数と p= に指定する要素の数は揃っており、かつ、p= の合計値は1にする必要があります。次のように書きます。
np.random.choice(5, 3, p=[0.1, 0, 0.3, 0.6, 0])
# >>> これは確率が 0=0.1, 1=0, 2=0.3, 3=0.6, 4=0を意味する
引数 replace で値の重複を許容するかどうかを指定
引数に replace=False を渡すと、値の重複を排除します。
np.random.choice(5, 3, replace=False)
# >>> 取得する乱数から値の重複を排除する
# >>> np.random.permutation(np.arange(5))[:3]と同じ
なお、関数に渡す配列の要素は数値である必要はありません。次のコードでご確認ください。
arr = ['サッカー', '野球', 'バスケ']
np.random.choice(arr, 5, p=[0.5, 0.3, 0.2])
3. まとめ
以上、numpy.random.choice関数の使い方を解説しましたが、今ではこの関数ではなく、Generator.choiceメソッドを使うようになっています。このメソッドの方が高速ですし、できることも増えています。
以下のページで確認しておきましょう。
コメント