numpy.random.choice – 既存の配列から乱数配列を生成

numpy.random.choice関数は、既存の配列の要素から任意の確率分布で乱数を生成する関数です。このページでは、この関数について解説していきます。

重要
NumPyのversion1.17以降は、乱数操作には、関数は使わずにジェネレータメソッドを使うようになりました。最大の理由は、ジェネレータから乱数を生成する方が遥かに高速であり、科学技術計算に適しているからです。そのため現在では、random.choice関数ではなく、Generator.choiceメソッドの使用が推奨されています。『Generator.choice – 既存の配列から乱数配列を生成』で解説しています。

目次

1. 書式

numpy.random.choice

書き方:

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 – 色々な連番の配列を生成』で解説しています。

In [1]:
import numpy as np
np.random.choice(5, 3)
# >>> np.random.randint(0, 5, 3)と同じ
Out[1]:
array([1, 0, 4])

引数 p で確率分布を指定

引数 p= を指定することで、確率分布を操作することができます。関数に渡す配列の要素の数と p= に指定する要素の数は揃っており、かつ、p= の合計値は1にする必要があります。次のように書きます。

In [2]:
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を意味する
Out[2]:
array([3, 0, 3])

引数 replace で値の重複を許容するかどうかを指定

引数に replace=False を渡すと、値の重複を排除します。

In [3]:
np.random.choice(5, 3, replace=False)
# >>> 取得する乱数から値の重複を排除する
# >>> np.random.permutation(np.arange(5))[:3]と同じ
Out[3]:
array([1, 3, 2])

なお、関数に渡す配列の要素は数値である必要はありません。次のコードでご確認ください。

In [4]:
arr = ['サッカー', '野球', 'バスケ']
np.random.choice(arr, 5, p=[0.5, 0.3, 0.2])
Out[4]:
array(['野球', 'サッカー', 'バスケ', '野球', 'サッカー'], dtype='<U4')

3. まとめ

以上、numpy.random.choice関数の使い方を解説しましたが、今ではこの関数ではなく、Generator.choiceメソッドを使うようになっています。このメソッドの方が高速ですし、できることも増えています。

以下のページで確認しておきましょう。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる