Python

Python初学者向け:Numpyによる乱数の生成を基本から解説

スポンサーリンク

 

この記事はこんな方におススメです
  • Pythonを始めたばかりで基本から学びたい方
  • Pythonの基本的な部分を速習してまずは全体像を把握しておきたい方

▶ Numpyの基本を解説しています。過去の記事はこちらからどうぞ。

はじめに

今回は(疑似)乱数の生成について基本から解説します。Numpyを使った(疑似)乱数の生成ではrandomというモジュールを使います。このモジュールの中には乱数を生成するいろんな関数が提要されています。順にみていきましょう。

乱数を生成する

np.random.rand()

まずは0以上1未満の値を返すrand()です。

np.random.rand(d0,d1,…)

d1,d2,..はディメンジョンです。d0,d1,…を省略すると1つの乱数のみを返します。見ていきましょう。

# 1つの乱数を生成
np.random.rand()
0以上1未満の1つの乱数を生成

これは毎回、実行のたびに異なる値が取得されます。再現性を持たせるために値を固定したければseedを指定します。次のようにすると、毎回同じ値が返ってくるようになります。

# seedを固定して1つの乱数を生成
np.random.seed(1)
np.random.rand()
seedを固定した乱数を取得

次にd0,d1を指定してみましょう。

# 2次元の配列で乱数を生成
np.random.rand(3,4)
2次元の配列で乱数を生成

d0=3,d1=4を指定したので3行4列の乱数が生成されます。

np.random.randint()

指定した最小値以上、最大値未満の範囲で整数を返すのがrandint()です。

np.random.randint(low, high=None, size=None)

randint()のdocstring

docstringを見ると、sizeはinteger あるいは、tupleが指定できるようです。試してみましょう。

# 5以上10未満の数字を10個取得
np.random.randint(5,10,10)
randint()で値を取得

sizeにintegerを指定した場合は、その個数だけ乱数を取得できます。今回はlow=5, high=10, size=10なので5以上10未満の整数が10個得られます。

次にsizeにtupleを指定した場合を見てみましょう。

# 3行4列で10以上100未満の数字で構成された行列を作成
np.random.randint(10,100,(3,4))
randintで3行4列の行列を作成

sizeにtupleを指定した場合は、指定した形状の行列が作られます。

np.random.randn()

次に標準正規分布から値を取ってくる場合はrandom.randn()を使います。

np.random.randn(d0,d1,…)

平均0, 分散1の標準正規分布から値を取ってきます。試してみましょう。

# ライブラリのインポート
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib

# 乱数を1000個生成
list=[]

for _ in range(1000):
    list.append(np.random.randn())

# ヒストグラムの描画    
plt.figure(figsize=(6,3))
plt.hist(list)
plt.title('標準正規分布から取得した値のヒストグラム')
plt.grid()

np.random.normal()

標準正規分布ではなく、任意の平均値・標準偏差の正規分布から値を生成する場合はnp.random.normal()を使います。

np.random.normal(loc=0, scale=1,size=None)

docstringを見てみましょう。

randn()のdocstring

locが平均値、scaleが標準偏差になります。defaultの値がそれぞれ0と1に設定されているので、loc, scaleを与えなければ標準正規分布から値を取ってきます。sizeはintegerあるいはtupleとありますね。やってみましょう。

# 平均2, 標準偏差3の正規分布から値を20個の値を取得
np.random.normal(loc=2, scale=3, size=20)
平均2, 標準偏差3の正規分布から値を20個の値を取得

sizeにintegerを与えた場合はその個数の値を生成します。sizeにtupleを与えてみましょう。

# 平均2, 標準偏差3の正規分布から値を取得して5行4列の行列を生成
np.random.normal(loc=2, scale=3, size=(5,4))
平均2, 標準偏差3の正規分布から値を取得して5行4列の行列を生成

np.random.choice()

最後に指定したndarrayやリストからランダムに値を取ってくる

np.random.choice(a, size=None)

choice()のdocstring

docstringをみると、aはndarrayやリスト、またはinteger、sizeはintegerあるいはtupleです。やってみましょう。

# aにintegerを指定
np.random.choice(10,size=5)
choice()でaにintgerを指定した場合

aにintegerを指定した場合です。この場合、np.arange(a)から値を取ってきます。今回はsizeに5を指定しているのでnp.range(10)から5つ値を取得します。

次にaにndarrayを指定してみましょう。

sample_array = np.array([1,2,3,4,5])

# ndarrayからランダムに値を取得
np.random.choice(sample_array,10)
ndarrayからrandomに値を取得

このように指定したndarrayからランダムに値を取得することができます。size=10としているので値を10個取得しています。sizeにはtupleも指定できます。

# ndarrayからランダムに値を取得して3行4列の行列を作成
np.random.choice(sample_array,(3,4))
ndarrayからランダムに値を取得して3行4列の行列を作成

sizeの部分をtupleで指定するのはこれまでにも出てきましたね。指定した形状の行列を作ることができます。

スポンサーリンク

まとめ

今回はNumpyで疑似乱数を生成する方法を扱いました。Numpyで乱数を扱う場合はrandomモジュールを利用します。以下にまとめておきます。

  • np.random.rand(d0,d1,…)
  • np.random.randint(low, high=None, size=None)
  • np.random.randn(d0,d1,…)
  • np.random.normal(loc=0, scale=1,size=None)
  • np.random.choice(a, size=None)

コメント

タイトルとURLをコピーしました