numpy.random.standard_exponential – 指数分布から乱数配列を生成

numpy.random.standard_exponentialは、指数分泌から乱数配列を生成する関数です。この使い方について解説していきます。

重要
NumPyのversion1.17以降は、乱数操作には、関数は使わずにジェネレータメソッドを使うようになりました。最大の理由は、ジェネレータから乱数を生成する方が遥かに高速であり、科学技術計算に適しているからです。そのため、現在はrandom.standard_exponential関数の使用は推奨されておらず、代わりにGenerator.standard_exponentialメソッドを使います。このページの後半では、このメソッドについても解説します。

目次

1. numpy.random.standard_exponentialの使い方

numpy.random.standard_exponential

書き方:

np.random.standard_exponential(size=None)

パラメーター:

size: int or tuple of ints, optional
出力する配列のshapeを指定する。デフォルト値のNoneでは、1つの乱数の値を返す。(参考:『NumPyのshape属性 – 配列の形状の確認と変更』)

戻り値: 

out: float or ndarray
指定した範囲の指数分布からの乱数を出力する。

一緒に確認したい関数:

  • Generator.exponential: ジェネレータメソッド。今後はrandom.exponentialではなく、こちらを使うこと。

指数分布とは

指数分布とは、以下のようなカーブを描く連続確率分布です。

出典: Wikipedia

簡単に言うと、地震が起きる間隔や、自転車のタイヤがパンクする間隔といったランダムなイベントの発生間隔を表しています。

サンプルコード

それではサンプルコードを見ていきましょう。引数に何も指定しない場合、指数分布の中からランダムに乱数を1つ生成します。

In [1]:
import numpy as np
np.random.standard_exponential()
Out[1]:
2.8383961280505585

引数では、配列のshapeを指定します。shapeについては『NumPyのshape属性 – 配列の形状の確認と変更』で解説しています。

In [2]:
np.random.standard_exponential(10)
Out[2]:
array([3.0707459 , 0.62434375, 0.311567  , 1.09992946, 0.28183401,
       0.97301507, 0.64229247, 0.09452829, 0.12895261, 0.63632238])

二次元以上の配列を指定したい場合は、shapeをタプルで渡します。

In [3]:
np.random.standard_exponential((5, 3))
Out[3]:
array([[1.55589435, 1.89348869, 0.14103153],
       [1.4878394 , 0.85404001, 0.4396228 ],
       [2.92479659, 2.59558811, 0.15382967],
       [4.01905513, 0.35021347, 1.4033548 ],
       [0.19220809, 3.49500778, 1.87231889]])

以上が、numpy.random.standard_exponential関数です。冒頭で述べた通り、NumPy1.17以降は、この関数の使用は推奨されていません。今後、新しいコードを書くときは、次に解説するGenerator.standard_exponentialメソッドを使いましょう。

2. Generator.standard_exponentialの使い方

現在では、NumPyのrandomモジュールを使った乱数生成は、random.default_rng()コンストラクタで生成したジェネレータオブジェクトに対して、目的の確率分布のメソッドを適用する方法で行われるようになっています。

ここでは、この方法について解説します。まずは、Generator.standard_exponentialの基本的な書き方を確認しましょう。

Generator.standard_exponential

書き方:

Generator.standard_exponential(size=None, dtype=np.float64, method='zig', out=None)

パラメーター:

size: int or tuple of ints, optional
出力する配列のshapeを指定する。デフォルト値のNoneでは、1つの乱数の値を返す。(参考:『NumPyのshape属性 – 配列の形状の確認と変更』)
dtype: dtype, optional
出力のデータ型を指定します。float64とfloat32のみ可能です。(参考: 『NumPyのdtype属性の一覧と参照・指定・変更方法』)
method: str, optional
‘inv’ か ‘zig’ を指定可能。’inv’ は inverse CDF メソッドを使う。’zig’ は、非常に速い Ziggurat メソッドを使う。デフォルト値は ‘zig’。
out: ndarray, optional
関数の戻り値を、既存の配列に代入したい場合に使う。戻り値と代入先のshapeとデータ型が揃っている必要がある。

戻り値: 

out: float or ndarray
指定した範囲の指数分布からの乱数を出力する。

サンプルコード

Generator.standard_exponentialは、ジェネレータに対して使います。そのため、まずはrandom.default_rng()でジェネレータオブジェクトを生成する必要があります。

以下のコードでご確認ください。

In [1]:
import numpy as np
#  ジェネレータオブジェクトの生成
rng = np.random.default_rng()
# オブジェクトにメソッドを使用
rng.standard_exponential()
Out[1]:
3.0818932603929032

基本的な使い方は、random.standard_exponential関数と同じです。引数で、出力のshapeを指定することができます。

In [2]:
rng.standard_exponential(10)
Out[2]:
array([0.31920167, 0.04527248, 0.60781992, 0.04773801, 2.26872657,
       1.75706831, 0.73736511, 5.02371162, 4.22517957, 0.21750386])

2次元配列以上を指定する場合は、shapeをタプルで渡します。

In [3]:
rng.standard_exponential((5, 2))
Out[3]:
array([[0.12682714, 0.20584236],
       [0.59239079, 0.691938  ],
       [0.07385893, 0.11385297],
       [1.09066347, 1.36791684],
       [0.20391445, 0.10409465]])

引数の method= と out= については割愛します。特に method = をわざわざ指定するような場合は、まずないでしょう。

3. まとめ

以上がnumpy.random.standard_exponentialです。この関数は指数分布から乱数配列を生成する際に使います。ただし、現在ではGenerator.standard_exponentialメソッドの使用が推奨です。今後は、後者を利用するようにしましょう。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる