numpy
では、random
モジュールに乱数関連の関数が複数用意されています。
random
モジュール内には、大きく分けて3つの機能があります。
① 基本的な乱数生成:rand()
関連
② 順列操作:shuffle()
、permutation()
③ 確率分布:beta()
関数、gamma()
関数など様々な分布関数
今回は、①基本的な乱数生成のrand()
関連についてまとめます。
- rand()関連の分類
- rand(): 0以上1未満の乱数
- random_sample():0以上1未満の乱数
- random(), ranf(), sample()は全て…
- randint():整数の乱数(上端含まない)
- random_integers():整数の乱数(上端含む)非推奨
- randn() ⇒ 標準正規分布に従う乱数
rand()関連の分類
rand()
で始まる基本的な乱数生成の関数を、分布関数、出力の型に基づいて分類します。
以下では、各関数を図内の上から順に解説していきます。
rand(): 0以上1未満の乱数
optional引数の有無で、出力の形式が異なります。
rand()
⇒ float
の数値
rand(d0, d1, ..., dn)
⇒ float
の配列array
※引数はタプルやリストではなく、リテラルを並べるd0, d1, ..., dn
。
⇒ タプルを渡す場合には*
をつけて展開することで使用できます。
rand() ⇒ 乱数を1つ生成
0以上1未満の乱数をfloat
で返します。
a = np.random.rand()
# a → 0.10790391028773294 #floatの乱数
rand(d0, d1, ..., dn) ⇒ 乱数の配列
0以上1未満の乱数を、引数で与えた形状の配列array
で返します。
引数はタプルやリストではなく、リテラルを並べる点に注意してください。
タプルを渡す場合には*
をつけて展開することで対応できます。
# 2×3の配列で出力
A = np.random.rand(2, 3)
# A → array([[0.72131228, 0.70379534, 0.09084348],
# [0.33552836, 0.9948185 , 0.40890465]])
# タプルを展開する例
my_shape = (3, 2)
B = np.random.rand(*my_shape)
# B → array([[0.3442719 , 0.27145758],
# [0.37406329, 0.5012307 ],
# [0.86624901, 0.02328086]])
random_sample():0以上1未満の乱数
rand()
とほとんど同じですが、引数の与え方が異なります。
random_sample()
⇒ float
の数値
random_sample((d0, d1, ..., dn))
⇒ float
のarray
※引数はタプルやリストで与える(d0, d1, ..., dn)
。
random_sample() ⇒ 乱数を1つ生成
0以上1未満の乱数をfloat
で返します。
a = np.random.random_sample()
# a → 0.05878785814801479 #floatの乱数
random_sample( (d0, d1, ..., dn) ) ⇒ 乱数の配列
0以上1未満の乱数を、引数で与えた形状の配列array
で返します。
引数はタプルやリストで与えます。
# 2×3の配列で出力
A = np.random.random_sample((2, 3))
# A → array([[0.1423671 , 0.22820989, 0.9287329 ],
# [0.42734575, 0.61141824, 0.87658159]])
# タプルの変数を与える例
my_shape = (3, 2)
B = np.random.random_sample(my_shape)
# B → array([[0.63451237, 0.73150453],
# [0.82004998, 0.72125612],
# [0.71012427, 0.9402507 ]])
random(), ranf(), sample()は全て…
random()
、ranf()
、sample()
は全てrandom_sample()
の別名(エイリアス)です。
random_sample()
と完全に同じ機能を持ちます。
randint():整数の乱数(上端含まない)
randint()
は、引数によって整数乱数の範囲、出力形式を指定できます。
randint(n)
⇒ 0
以上n
未満の整数の乱数
randint(low, high)
⇒ low
以上high
未満の整数の乱数
※引数の上端の値は含まない(未満)
randint(n, size = (i0, i1,…, in))
⇒ 出力配列の形状指定
randint(n) ⇒ 0以上n未満の整数の乱数
引数を1つだけ指定すると、0以上でその値未満の整数乱数を返します。
a = np.random.randint(10)
# a → 7
n = 100
b = np.random.randint(n)
# a → 81
randint(low, high) ⇒ low以上high未満の整数の乱数
引数を2つ指定(low, high)
すると、low
以上high
未満の整数乱数を返します。
a = np.random.randint(10, 20)
# a → 12
l, h = 100, 300
b = np.random.randint(l, h)
# b → 119
size = (i0, i1,…, in) ⇒ 出力配列の形状指定
optional引数で出力する整数乱数の形状を指定できます。
size
指定なし ⇒ int
の数値
size = i
⇒ int
の一次元配列array
size = (i0, i1, ..., in))
⇒ int
の多次元配列array
各実行例を以下に記載します。
# size = i
a = np.random.randint(10, size=5)
# a → array([4, 6, 3, 6, 4])
# size = (i0, i1,…, in)
A = np.random.randint(10, size=(2, 3))
# array([[4, 2, 4],
# [0, 0, 3]])
l, h = 10, 50
B = np.random.randint(l, h, size=(3, 2))
# array([[36, 26],
# [28, 17],
# [26, 37]])
random_integers():整数の乱数(上端含む)非推奨
random_integers()
は、randint()
に類似した関数です。
randint()
と異なる点は次の通りです。
random_integers(n)
⇒ 1
以上n
以下の整数の乱数
random_integers(low, high)
⇒ low
以上high
以下の整数の乱数
しかし、マニュアルによれば非推奨(deprecated)とのことですので、詳細は割愛します。
randn() ⇒ 標準正規分布に従う乱数
標準正規分布に従う乱数をfloat
で返します。
optional引数の有無で、出力の形式が異なります。
randn()
⇒ float
の数値
randn(d0, d1, ..., dn)
⇒ float
の配列array
※引数はタプルやリストではなく、リテラルを並べるd0, d1, ..., dn
。
⇒ タプルを渡す場合には*
をつけて展開することで使用できます。
標準正規分布とは?
次の図ような確率密度関数を持つ分布です。
ざっくり言えば、0に近い乱数を生成する確率が高いです。
約68%の確率で±1、約95%で±2、約99.7%で±3以内に収まる乱数を生成します。
randn() ⇒ 乱数を1つ生成
a = np.random.randn()
# a → -0.7143959915812806
randn(d0, d1, ..., dn) ⇒ 乱数の配列
標準正規分布に従う乱数を、引数で与えた形状の配列array
で返します。
引数はタプルやリストではなく、リテラルを並べる点に注意してください。
タプルを渡す場合には*
をつけて展開することで対応できます。
# 2×3の配列で出力
A = np.random.randn(2, 3)
# A → array([[ 0.21935077, 0.2497179 , -0.02381864],
# [-0.1321383 , 0.9800149 , -0.50530219]])
# タプルを展開する例
my_shape = (3, 2)
B = np.random.randn(*my_shape)
# B → array([[ 1.20788819, 0.39244815],
# [ 0.77729134, 1.05760577],
# [-1.1641865 , 0.21312759]])