Python入門トップページ


目次

  1. NumPy とは
  2. Python リストの場合
  3. NumPy の使用例
  4. NumPy で線形代数
  5. NumPy の乱数生成
    1. NumPy の乱数生成 (Random Generator)
    2. 実数分布
    3. 整数分布
    4. シーケンス用の関数
    5. Legacy な乱数生成 (numpy.random)

NumPy

NumPy の乱数生成

実数分布

目次に戻る

一様分布

rng.random() では0以上1未満(これを \([0, 1)\) と書く)の乱数が得られます.乱数を1つ取得するには次のように記述します.


import numpy as np
rng = np.random.default_rng()
rng.random()
0.7510424357302106

配列形式で複数の乱数を取得したい場合には引数にその個数を記述します.例えば20個の乱数を取得します.


rng.random(20)
array([0.61910879, 0.45506578, 0.40584214, 0.5747741 , 0.34110944,
       0.03337927, 0.63102066, 0.97748876, 0.0469746 , 0.10357471,
       0.36831045, 0.51496081, 0.49989874, 0.85418164, 0.82197086,
       0.43439924, 0.51936752, 0.28139332, 0.70604489, 0.68540668])

行列形式で乱数を取得することも可能です.例えば5行4列の行列形式で乱数を発生させます.


rng.random((5, 4))
array([[0.66690272, 0.71264989, 0.56193543, 0.88833542],
       [0.41937717, 0.35458837, 0.9833979 , 0.38010772],
       [0.27829787, 0.59289146, 0.67608182, 0.4518037 ],
       [0.96588848, 0.28687974, 0.32735673, 0.96304148],
       [0.23311186, 0.56081599, 0.75079351, 0.3288013 ]])

rng.random() では \([0, 1)\) の乱数が得られるが,\([a, b)\) となる一様乱数は次の式で得られることに注意してください.

\begin{eqnarray} (b - a) \times {\rm rng.random}() + a \end{eqnarray}

例えば,10以上 20未満の一様乱数は次のようにすると得られます.


a = 10.
b = 20.
(b - a) * rng.random(20) + a
array([17.38317556, 15.89043445, 12.47497242, 16.49860675, 19.39795095,
       14.01733527, 10.6437123 , 14.88071486, 17.15653046, 16.16725056,
       17.17762184, 18.78073906, 13.4718312 , 12.86551775, 10.90441749,
       19.3545728 , 13.61795001, 14.7539568 , 13.31334217, 12.41434622])

目次に戻る

正規分布

正規分布に従う乱数を生成するには rng.normal(loc=0.0, scale=1.0, size=None) が利用できます.ここで,引数の loc=0.0 は平均,scale=1.0 は標準偏差です.

たとえば,平均0,標準偏差1の標準正規分布に従う10個の乱数を生成してみます.


import numpy as np
rng = np.random.default_rng()
mu = 0
sigma = 1
rng = np.random.default_rng()
rng.normal(mu, sigma, 10)
array([-2.09957975, -0.60196235,  0.95884905, -0.50298942,  0.97088488,
        1.04152109, -1.60688527,  0.14234796, -0.6607533 , -0.74848114])

平均20,標準偏差3の正規乱数を1000個生成し,ヒストグラムを描いてみます.


import matplotlib.pyplot as plt
from IPython.display import set_matplotlib_formats
# from matplotlib_inline.backend_inline import set_matplotlib_formats # バージョンによってはこちらを有効に
set_matplotlib_formats('retina')

mu = 20
sigma = 3
rng = np.random.default_rng()
x = rng.normal(mu, sigma, 1000)

# ヒストグラムを描く
fig, ax = plt.subplots(1, 1, figsize=(6, 4))
ax.hist(x, bins=15)
# plt.savefig('rng-normal.png', dpi=300, facecolor='white')
plt.show()
rng-normal

目次に戻る

指数分布

指数分布に従う乱数を発生させるには rng.exponential(scale=1.0) が利用できます.このとき,scale=1.0 は平均です.つまり,次の1つ目の式にあるパラメータ \(\lambda\) ではなく,2つ目の式にある\(\beta = \frac{1}{\lambda}\) を指定することになります.

\begin{eqnarray} f(x) = \lambda \exp(-\lambda x), \end{eqnarray} \begin{eqnarray} f(x) = \frac{1}{\beta} \exp\left(-\frac{x}{\beta}\right), \end{eqnarray}

平均10の指数乱数を20個発生させてみます.


import numpy as np
rng = np.random.default_rng()

beta = 10  # 平均
rng.exponential(beta, 20)
array([ 2.79433895,  8.9634677 , 15.72659852,  1.31914157,  8.51271876,
       11.68924967,  3.68749529,  8.32294057, 20.79189747,  6.5146796 ,
       13.43601827,  2.67192947,  0.13566797,  7.04711664, 21.96355673,
        3.40537485, 11.87978411,  8.11521344, 25.40077768,  2.92818262])

平均10の指数乱数を1000個発生させてヒストグラムを描いてみます.


import matplotlib.pyplot as plt
from IPython.display import set_matplotlib_formats
# from matplotlib_inline.backend_inline import set_matplotlib_formats # バージョンによってはこちらを有効に
set_matplotlib_formats('retina')

beta = 10  # 平均
rng = np.random.default_rng()
x = rng.exponential(beta, 1000)

# ヒストグラムを描く
fig, ax = plt.subplots(1, 1, figsize=(6, 4))
ax.hist(x, bins=50)
# plt.savefig('rng-exponential.png', dpi=300, facecolor='white')
plt.show()
rng-exponential

目次に戻る