YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

【完全保存版】numpy random | randn、rand、randint全部あり!rand関係総まとめ【サンプルコード】

numpyでは、randomモジュールに乱数関連の関数が複数用意されています。

randomモジュール内には、大きく分けて3つの機能があります。

3つの機能

① 基本的な乱数生成:rand()関連

② 順列操作:shuffle()permutation()

③ 確率分布:beta()関数、gamma()関数など様々な分布関数

今回は、①基本的な乱数生成のrand()関連についてまとめます。

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))floatarray

引数はタプルやリストで与える(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()の引数

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引数で出力する整数乱数の形状を指定できます。

randint()の出力size指定

size 指定なし ⇒ intの数値

size = iintの一次元配列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()の引数

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]])