Generators.choice は、NumPyのrandomモジュールで、既存の配列の要素から、任意の確率分布で乱数を生成するためのジェネレータメソッドです。
これと同じ操作は、NumPyのversion1.17まではrandom.choice関数で行っていました。しかし現在では、default_rng で作成したインスタンス(「ジェネレータオブジェクト」とも言う)に対して、Generators.choiceメソッドを呼び出すことで行うようになりました。
なお、default_rng については、『numpy.random.default_rng – 乱数生成のためのジェネレータオブジェクトの作成』で解説しているので確認しておいて下さい。
このページでは、このGenerators.choiceの使い方を解説します。こちらの方が従来の関数を使った乱数生成よりも大幅に高速で、大量のデータを扱う科学技術計算に適していますので、ぜひ抑えておきましょう。
1. 書式
書き方:
Generator.choice(a, size=None, replace=True, p=None, axis=0, shuffle=True)
パラメーター:
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の確率分布。指定しない場合は、一様分布としてみなす。 |
axis: int, optional 配列のどの軸から乱数を取得するかを指定します。デフォルト値の0では、1行目の要素の中から乱数の値を取得します。 |
shuffle: bool, optional 値の重複なしの場合(replace=Falseの場合)に乱数をシャッフルするかどうか。デフォルト値はTrueだが、Falseにすると処理速度が速くなる。 |
戻り値:
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.integers
- Generator.shuffle
- Generator.permutation
2. サンプルコード
ジェネレータメソッドは、すべて default_rng で作成したインスタンスに対して使用します。これについては、以下のページで解説しています。
インスタンスの作成は、以下のコードのように、任意の変数にdefault_rng を代入することで行います。
import numpy as np
rng = np.random.default_rng()
rng
これで、ジェネレータオブジェクトの rng が作成されました。このジェネレータオブジェクト rng に対して choice メソッドを使います。
それではサンプルコードを見ていきましょう。
引数 a に数値を渡す場合
引数 a に数値を渡した場合は、np.arange(a) を渡したのと同じことになります。この関数については『numpy.arange – 色々な連番の配列を生成』でご確認ください。
以下のコードでは、引数 a に 5 を、引数 size に 5 を渡しています。
rng.choice(5, 5)
# >>> rng.integers(0, 5, 5)と同じ
このように、[0, 1, 2, 3, 4]の中から、数値をランダムに取得します。
なお、Generator.integersについては『Generator.integers – 離散一様分布から整数の乱数配列を生成』で解説しています。
引数 p で各要素の取得確率を指定
Generator.choiceで要素を取得する場合、通常は、全ての要素を全く等しい確率で取得します(=一様分布)。そして、オプション引数 p= では、各要素の取得確率を指定することができます。
オプション引数 p= に渡すのは、配列やリストなどのarray_likeオブジェクトである必要があります。また、その要素数は、引数aに渡した配列の要素数と揃っており、かつ合計値が1.0になるようにする必要があります。
以下のコードをご確認ください。
rng.choice(5, 5, p=[0.1, 0, 0.3, 0.6, 0])
# >>> 確率が 0=10%, 1=0%, 2=30%, 3=60%, 4=0% で要素を取得
引数 replace で値の重複を除外
オプション引数 replace では、値の重複を許容するかどうかを指定することができます。これをFalseにすると、元の配列から、値が重複しないように乱数を生成します。
# replace=False で値の重複を除外
rng.choice(5, 5, replace=False)
引数 axis で軸を指定(引数aに多次元配列を渡した場合)
引数 a に多次元配列を渡した場合は、axis で、どの軸をランダムに取得するのかを指定することができます。
次の2次元配列を例に見てみましょう。
# 2次元配列を生成
arr = rng.integers(0, 10, (3, 3))
arr
まず、デフォルト(axis=0)では、最初の軸をランダムに取得します。2次元配列の場合は行を取得します。
# デフォルトでは、渡した配列から行をランダムに取得
rng.choice(arr, 5)
axis=1 を指定してみましょう。この場合、2次元配列では列をランダムに取得します。
# axis=1にすると、渡した配列から列をランダムに取得
rng.choice(arr, 5, axis=1)
引数 shuffle で要素をシャッフルの有無を指定(replace=Falseの場合)
オプション引数 shuffle では、replace=Falseの場合に、元の配列の要素の順序を並び替えるかどうかを指定することができます。デフォルト値のTrueでは順序をランダムに並び替えますが、Falseを指定すると、元の並びを保持します。そのため、Falseの方が処理速度は速くなります。
以下のコードをご確認ください。
rng.choice(5, 5, replace=False, shuffle=False)
3. まとめ
以上が Generator.choice の使い方です。これまでは、同じ操作をするのに、numpy.random.choice関数が使われてきましたが、これからはこの Generator.choice を使うようにしていきましょう。
コメント