numpyのrandomで生成できる乱数を総まとめ

今回はNumpyのrandomモジュールによる乱数の生成方法をマスターしましょう。乱数とはランダムな数値のことで、様々な数値を自動で生成してくれます。一見地味なスキルではありますが、非常に便利です。特に今後データ解析の学習を進めていこうと考えている方は、多くの場面で遭遇することになると思います。

例えば、Pandas(パンダス)などでサンプルの数値を入れる時や実験的にコードを試すときなど、著者がrandomモジュールで中身の数値を挿入するために書かれていることも多いので、理解しておいてまったく損はありません。


randomモジュールをマスターする(基礎編)

ここから、一様分布の乱数生成と正規分布の乱数生成、そして配列内をランダムでシャッフルする方法を順に見ていきましょう。基礎編のあとは応用編として、二項分布の乱数生成、ベータ分布、ガンマ分布、カイ二乗分布の乱数を紹介します。

この中で整数の乱数を出力する方法やseedを使って同一の乱数を出力するやり方についても説明していきます。

一様分布の乱数を出力する

numpy.random.rand()を使う

Numpyではrandom.rand()を使い、0.0から1.0までの間隔の中で一様乱数を出すことができる。

Python
import numpy as np

# 一様乱数を1件出力する
np.random.rand()
0.19263105026514205

# 一様乱数を5件出力する
np.random.rand(5)
array([0.10632005, 0.28402413, 0.88981626, 0.65188964, 0.49615223])

# 一様乱数を6×3の行列で出力する
np.random.rand(6, 3)
array([[0.59803771, 0.38233604, 0.58876469],
       [0.87629038, 0.70842692, 0.94306721],
       [0.85641941, 0.13032652, 0.05699555],
       [0.56664798, 0.30769374, 0.3028966 ],
       [0.63146436, 0.44859626, 0.79071794],
       [0.3392113 , 0.45282187, 0.64717234]])
MEMO
一様乱数とは、すべての値の出現確率が等しい乱数のこと。

numpy.random.randint()を使う

random.randint()を使うと、特定の区間の整数を返すことができます。引数の指定の仕方はnumpy.random.randint(上限[, 下限[, 出力したい件数]])です。引数に1つのみ数値を入れた場合、0からその数値までの間で整数が返ります。2つ入れた場合、その2つの数値の間の整数が出力されます。3つ入力した場合、3つ目に入力した数値の件数分出力されます。なお、ここをタプル型で指定すると行列形式で返ってきます。

Python
import numpy as np

# 0~4までの整数を返す
np.random.randint(5)
4

# 5~29までの整数を返す
np.random.randint(5, 30)
17

# 5~29までの整数を3つ返す
np.random.randint(5, 30, 3)
array([27, 10, 14])

# 5~29までの整数を3×2の行列で返す
np.random.randint(5, 30, (3, 2))
array([[17,  9],
       [23, 10],
       [18, 17]])

numpy.random.random_sample()ってなにがちがうの?

numpyの学習を進めている方はnumpy.random.rand()numpy.random.random_sample()の違いについて疑問に思った方が多いと思います。

出力されるデータは同じですが、引数の指定方法が若干違います。numpy.random.random_sample()で行列を指定する際はタプル型になります。

Python
import numpy as np

# 上記で見た通り、random.rand()で行列指定すると以下のようになる
np.random.rand(2, 3)
array([[0.13903588, 0.14618068, 0.3083508 ],
       [0.67215654, 0.37713677, 0.96467314]])

# random_sanpleで同様に指定するとエラーが起きる
np.random.random_sample(2, 3)
TypeError: random_sample() takes at most 1 positional argument (2 given)

# タプル型で指定するとエラーは起きない
np.random.random_sample((2, 3))
array([[0.59509659, 0.91697841, 0.22291366],
       [0.53474336, 0.98980916, 0.82039776]])
MEMO
  • numpy.random.random()
  • numpy.random.ranf()
  • numpy.random.sample()

も存在しますが、numpy.random.random_sample()の別名で機能は全く同じです。


正規分布の乱数を出力

numpy.random.normal()を使う

正規分布に従って乱数を出力することができます。引数には、numpy.random.normal(平均, 分散, 出力したい件数)のようにします。平均と分散と出力件数を指定することができ、件数部分を行列形式にするにはタプル形式で指定します。引数を省略した場合は、平均=0.0, 分散=1.0, 件数=1で返ります。

Python
import numpy as np

# デフォルトの平均=0.0, 分散=1.0, 件数=1
np.random.normal()
1.2297392050343505

# 平均=30, 分散=5, 件数=2×3の行列
np.random.normal(30, 5, (2, 3))
array([[31.60288962, 37.05213911, 28.7232151 ],
       [44.09011378, 26.25410492, 38.15256765]])

numpy.random.randn()を使う

こちらは平均=0, 標準偏差=1の正規分布に従う乱数を出力します。引数に指定するのは件数のみとなります。

Python
np.random.randn(2, 2)
array([[ 0.69573118, -0.92534441],
       [ 0.72901048,  1.28913392]])

配列をランダムにシャッフルする

配列の順序を並び替えることもできます。numpy.random.shuffle()はとても便利なので覚えておきましょう。引数にはシャッフル対象の配列を指定します。

Python
import numpy as np
arr = ['A', 'B', 'C', 'D', 'E']
np.random.shuffle(arr)
['E', 'A', 'D', 'C', 'B']

乱数の出力を固定する

データ分析をしていると、再現性が必要な場合がよくあります。その際、ランダムで数値が出力されるのは非常に困ります。そこで便利なのがseed(シード)です。seedを設定すると、何回randomモジュールを使っても同様の数値が出力されます。一見活躍どころがなさそうですが、これが非常に便利です。

Python
import numpy as np

# シードを35に設定して乱数を出力
np.random.seed(seed=35)
np.random.rand()
0.45805494822409054
 
# シードを35に設定して再度乱数を出力 (同じ乱数が出力されます)
np.random.seed(seed=35)
np.random.rand()
0.45805494822409054

randomモジュールをマスターする(応用編)

ここから紹介する乱数生成は、ほとんどの方が日常的によく使うというわけではないと思います。ただ、このような出力方法もあるということを知っておくことで視野も広がるので応用編として見ていきましょう。絶対使わない!という方は最後のまとめをご覧ください。

二項分布の乱数を出力する

二項分布に従う乱数を生成します。件数はタプル型で指定します。これは二項分布を理解していないと引数の指定が難しいと思いますので、Wikipediaのリンクを貼っておきます。

参考 二項分布Wikipedia
Python
import numpy as np

np.random.binomial(10, 0.5, 5)
array([6, 6, 2, 7, 4])

ベータ分布の乱数を出力する

ベータ分布に従う乱数を生成します。件数はタプル型で指定します。これはベータ分布を理解していないと引数の指定が難しいと思いますので、Wikipediaのリンクを貼っておきます。

参考 ベータ分布Wikipedia
Python
import numpy as np

np.random.beta(2, 2, 5)
array([0.22983859, 0.39079046, 0.52345156, 0.29673193, 0.74359428])

ガンマ分布の乱数を出力する

ガンマ分布に従う乱数を生成します。件数はタプル型で指定します。これはガンマ分布を理解していないと引数の指定が難しいと思いますので、Wikipediaのリンクを貼っておきます。

参考 ガンマ分布Wikipedia
Python
import numpy as np

np.random.gamma(5, 1, 5)
array([3.90135544, 5.96691621, 5.31852235, 1.99667684, 7.40922658])

カイ二乗分布の乱数を出力する

カイ二乗分布に従う乱数を生成します。件数はタプル型で指定します。これはカイ二乗分布を理解していないと引数の指定が難しいと思いますので、Wikipediaのリンクを貼っておきます。

参考 カイ二乗分布Wikipedia
Python
import numpy as np

np.random.chisquare(3, 5)
array([3.38863581, 3.40459342, 6.27822256, 6.49789474, 5.71985081])

まとめ

Numpyのrandomモジュールの使い方を解説してきました。最後にこの記事のまとめを書いておきます。

覚えておきたいポイント
  • rand()で一様乱数を出力
  • randint()で特定区間の整数を返す
  • normal()で正規乱数を出力
  • 配列をシャッフルできるのはshuffle()
  • seed()で乱数を固定
  • binomial()は二項分布の乱数生成
  • beta()はベータ分布の乱数生成
  • gamma()はガンマ分布の乱数生成
  • chisquare()はカイ二乗分布の乱数生成