numpy.random.standard_normal – 平均0標準偏差1の正規分布から乱数配列を生成

numpy.random.standard_normalは、平均0標準偏差1の正規分布の乱数を生成する関数です。

これとまったく同じ機能のものに、numpy.random.randn関数があります。違いは、引数でshapeを指定する際に、standard_normalはタプルを渡しますが、randnは数値を渡す点にあります。

ここでは、standard_normalについて解説します。

重要
NumPyのversion1.17以降は、平均0、標準偏差1の正規分布の乱数を生成する際には、standard_normal関数もrandn関数も使わずに、Generator.standard_normalというジェネレータメソッドを使うようになりました。こちらの方が圧倒的に処理速度が早く、NumPyを使った科学技術計算に適しています。『Generator.standard_normal – 平均0標準偏差1の正規分布から乱数配列を生成』で詳しく解説しているのでご確認ください。

目次

1. 書式

numpy.random.normal

書き方:

numpy.random.standard_normal(size=None)

パラメーター:

size: int or tuple of ints, optional
戻り値の配列の次元数を指定する。この引数を指定しない場合は、浮動小数点(float型)の数値を1つ返す。

戻り値: 

float or ndarray:
要素の型が浮動小数点の任意のshapeの配列、またはsizeを指定しない場合はランダムな浮動小数点の値。

一緒に確認したい関数:

  • Generator.standard_normal: 平均0標準偏差1の正規分布の乱数配列を生成するメソッド。新しいコードを書くときは、これを優先して使うこと
  • random.normal: 任意の平均・標準偏差の正規分布の乱数配列を生成する関数
  • random.randn: 平均0標準偏差1の正規分布の乱数配列を生成する関数

標準正規分布とは

繰り返しになりますが、numpy.random.standard_normalは、numpy.random.randnと同じく、平均0標準偏差1の正規分布(「ガウス分布」とも言う)の乱数を生成する関数です。

正規分布とは、以下のように平均値付近にデータが集積するような確率分布のことです。

In [1]:
import numpy as np
import matplotlib.pyplot as plt
rand = np.random.standard_normal(1000000)
plt.hist(rand, bins=300)
plt.xlabel('x')
plt.ylabel('frequency')
plt.xlim(-5, 5)
plt.show()

numpy.random.standard_normalの値は、この標準正規分布の中からランダムに生成されます。つまり、平均の0に近い数値ほど頻繁に生成されるということです。

それでは、コードを見てみましょう。

2. サンプルコード

引数に何も指定しない場合は、正規分布の中からランダムな浮動小数点の数値を1つ返します。

In [1]:
import numpy as np
np.random.standard_normal()
Out[1]:
0.5129254486106638

sizeの指定

引数にshapeを渡すと、ランダムな数値の配列を返します。

In [2]:
np.random.standard_normal(3)
Out[2]:
array([-3.07315563, -0.18386966, -1.87867352])

2次元配列以上では、shapeをタプルで渡します。shape属性については『NumPyのshape属性 – 配列の形状の確認と変更』で解説しています。

In [3]:
np.random.standard_normal((2, 3))
Out[3]:
array([[ 0.57471126,  0.27328516, -0.64723633],
       [-1.17202308, -0.41778232,  1.09905653]])

任意の平均・標準偏差を指定する方法

もし平均がμ、分散がσ2 の正規分布 N(μ, σ2) からランダムな数値を得たいとしたら、次のように書きます。なお、σは標準偏差です(※標準偏差 = √分散2

μ + σ * np.random.standard_normal(size=...)

例として、N(3, 6.25)の正規分布からランダムな値を得たいとします。この場合、標準偏差は、√6.25=2.5です。そのため次のように書きます。

In [4]:
# N(3, 6.25)
3 + 2.5 * np.random.standard_normal(size=(2, 4))
Out[4]:
array([[-1.596283  ,  2.17982182,  5.13924364,  4.53063027],
       [ 2.55574132,  7.5815871 ,  1.3160852 ,  0.89618385]])

ただし、平均や標準偏差を操作するには、この方法よりも、numpy.random.normal関数を使う方が遥かに簡単です。この関数は引数で、平均と標準偏差を指定することができます。以下のページで解説しています。

3. まとめ

ここまで見てきた通り、numpy.random.standard_normalは、平均0、標準偏差1の正規分布から乱数を生成する関数です。これと全く同じ関数に、numpy.random.randnがあります。

両者の違いは下表の通りです。

Table: 標準正規分布(平均0標準偏差1)の乱数を生成する関数

関数 引数 備考
standard_normal  タプル  
randn 数値  Matlabからコードをポートするユーザー用に用意された
現在は Generator.standard_normalメソッドの使用が推奨

しかし、現在では、これらの関数は使わずに、Generator.standard_normalメソッドを使います。ジェネレータを通して乱数を生成するこちらの方が、遥かに高速なため、大量の数値を扱う科学技術計算に適しています。

今後は、平均0標準偏差1の正規分布から乱数を生成する方法は、Generator.standard_normalに一本化しましょう。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる