numpy.random.default_rng – 乱数生成のためのジェネレータオブジェクトの作成

NumPyのrandomモジュールは、様々な乱数を生成するために、科学技術計算において多用するものです。そして、version1.17以降は、randomモジュールにおける乱数生成方法が、従来の関数を使う方法から、ジェネレータメソッドを使う方法に変更されました。

このページでは、version1.17以降の乱数生成のカギとなる default_rngコンストラクタについて解説します。今後乱数を生成する際は、このページで解説する方法で一本化していきましょう。

なお、このページではインスタンスやオブジェクトという言葉を使いますが、両者はほとんど同じ意味として扱っています。インスタンスやオブジェクトとは何かについては、オブジェクト指向プログラミングの理解を深めることが役立ちます。以下の記事を参考にして頂ければと思います。

目次

1. NumPy version1.17以降の乱数生成方法

NumPyのversion1.17以降、randomモジュールで乱数を生成する方法が変わりました。それまでは、以下のように任意の確率分布の関数を使うという方法で乱数を生成していました。

In [1]:
''' 今までの方法 '''
import numpy as np
np.random.standard_normal(5)
Out[1]:
array([-0.7936738 , -0.26237631,  2.61777239,  0.42852963,  2.59047746])

しかし、現在は default_rng で、乱数ジェネレータのインスタンスを生成し、そのインスタンスに対して、特定の確率分布から乱数を取得するメソッドを使う方法に変わっています。

In [1]:
''' この方法を使う '''
import numpy as np
rng = np.random.default_rng()
rng.standard_normal(5)
Out[1]:
array([-1.03195642,  1.55392024, -1.13092194,  2.60058294, -0.72663204])

この変更が行われた最大の理由は、乱数生成処理の高速化にあると言えるでしょう。科学技術計算では大量のデータを扱います。その点において、ジェネレータを通して乱数を生成する方がメモリの節約になり、遥かに高速になるため有用なのです。

今までの方法

  1. 確率分布関数を使って乱数を生成

新しい方法

  1. default_rngでジェネレータのインスタンスを作る。
  2. インスタンスに対して、確率分布メソッドを呼び出す。

なお、default_rng は、様々な確率分布メソッドの使用を可能にする乱数ジェネレータのコンストラクタ(インスタンスを作成するために使うメソッド)です。現在は、乱数を生成するためには、必ずこのコンストラクタを使います。

それでは、次からこのコンストラクタの使い方を見ていきましょう。

2. numpy.random.default_rngの使い方

まずは、default_rngの書式を確認しておきましょう。なお、このコンストラクタには、オプション引数で seed を渡すことができますが、ほとんどの場合は使うことはありません。

numpy.random.default_rng

書き方:

numpy.random.default_rng()

パラメーター:

seed(optional): {None, int, array_like[ints], Seed Sequence, BitGenerator, Generator} 
ビットジェネレータを初期化する(使用可能な状態に整える)シード。None(空白)の場合は、新しい予測不可のエントロピーをOSから引っ張る。基本的にはNoneのままで良い。intかarray_like[ints]を渡した場合は、ビットジェネレータの初期ステートを引きだすために、シードシーケンスに渡される。シードシーケンスのインスタンスを渡すこともできる。ビットジェネレータを渡した時は、乱数ジェネレータにラップされる。乱数ジェネレータを渡した時は、それが変わらず戻される。

戻り値: 

Generator:
初期化した(使用可能な状態に整えた)ジェネレータオブジェクト

使い方は簡単です。

以下のように、このコンストラクタを任意の変数に代入するだけです。

In [1]:
import numpy as np
rng = np.random.default_rng()
rng
Out[1]:
Generator(PCG64) at 0x7FEFECB5EE58

これで、乱数ジェネレータのインスタンス rng が作成されました。乱数を生成したい場合は、このインスタンス rng に対して、メソッドを呼び出します。

たとえば、以下のコードでは、指定の範囲の離散一様分布から乱数を取得するジェネレータメソッドである Generator.integers を呼び出すことで、指定の範囲の整数の乱数を取得しています。

In [2]:
rng.integers(0, 10, 10)
Out[2]:
array([6, 6, 8, 3, 8, 0, 9, 9, 0, 8])

randomモジュールでは、様々なジェネレータメソッドが用意されています。早速、次から使用可能なジェネレータメソッドについて確認していきましょう。

補足:ビットジェネレータの変更

default_rngコンストラクタでは、ビットジェネレータとしてPCG64を使っています。これは、NumPy1.17よりも前に使われていたMT19937よりも有利な統計学的特徴をもつビットジェネレータです。まずないと思いますが、MT19937を使ったインスタンスを作成したい場合は、以下を参考にしてください。

ビットジェネレータの変更

作成したジェネレータのインスタンスのビットジェネレータは、Generator.bit_generator属性で確認することができます。

In [1]:
import numpy as np
rng = np.random.default_rng()
rng.bit_generator
Out[1]:
<numpy.random._pcg64.PCG64 at 0x7ff642b32d38>

ビットジェネレータとして従来のMT19937を使用したインスタンスを作成する場合は、次のように書きます。

In [1]:
import numpy as np
rg = np.random.Generator(np.random.MT19937())
rg.bit_generator
Out[1]:
<numpy.random._mt19937.MT19937 at 0x7ff6408bb418>

3. 使用可能なジェネレータメソッド

それでは default_rng コンストラクタで作成したインスタンスに対して使用可能なジェネレータメソッドを確認していきましょう。なお、使い方はそれぞれのリンク先のページで解説しています。

ビットジェネレータの確認

bit_generatorジェネレータに使われているビットジェネレータのインスタンスを取得。

シンプルな乱数生成

integers(low[, high, size, dtype, endpoint])最小値lowと最大値highの範囲内から一様分布の乱数を返す。デフォルトではhighは乱数に含まれない。endopoint=True にするとhighも含まれる。
random([size, dtype, out])0.0以上1.0未満 [0.0, 1.0) の間の連続一様分布から浮動小数点数の乱数を返す。
choice(a[, size, replace, p, axis, shuffle])渡した1次元配列から乱数を生成する。
bytes(length)random bytesを返す。

配列の並べ替え

shuffle(x[, axis])既存の配列の要素をランダムに並べ替える。
permutation(x[, axis])既存の配列の要素をランダムに並べ替えた新しい配列を返す。

様々な確率分布からの乱数生成

beta(a, b[, size])ベータ分布から乱数を取得する。
binomial(n, p[, size])二項分布から乱数を取得する。
chisquare(df[, size])カイ二乗分布から乱数を取得する。
dirichlet(alpha[, size])ディリクレ分布から乱数を取得する。
exponential([scale, size])指数分布から乱数を取得する。
f(dfnum, dfden[, size])F分布から乱数を取得する。
gamma(shape[, scale, size])ガンマ分布から乱数を取得する。
geometric(p[, size])幾何分布から乱数を取得する。
gumbel([loc, scale, size])ガンベル分布から乱数を取得する。
hypergeometric(ngood, nbad, nsample[, size])超幾何分布から乱数を取得する。
laplace([loc, scale, size])ラプラス分布(二重指数分布)から乱数を取得する。
logistic([loc, scale, size])ロジスティック分布から乱数を取得する。
lognormal([mean, sigma, size)]対数正規分布から乱数を取得する。
logseries(p[, size])対数級数分布から乱数を取得する。
multinomial(n, pvals[, size])多項分布から乱数を取得する。
multivariate_hypergeometric(colors, nsample)多変量超幾何分布から変量を生成する。
multivariate_normal(mean, cov[, size])多変量正規分布から乱数を取得する。
negative_binomial(n, p[, size])負の二項分布から乱数を取得する。
noncentral_chisquare(df, nonc[, size])非心カイ二乗分布から乱数を取得する。
noncentral_f(dfnum, dfden, nonc[, size])非心F分布から乱数を取得する。
normal([loc, scale, size])正規分布(ガウス分布)から乱数を取得する。
pareto(a[, size])パレート分布から乱数を取得する。
poisson([lam, size])ポアソン分布から乱数を取得する。
power(a[, size])べき分布から乱数を取得する。
rayleigh([scale, size])レイリー分布から乱数を取得する。
standard_cauchy([size])標準コーシー分布から乱数を取得する。
standard_exponential([size, dtype, method, out])標準指数分布から乱数を取得する。
standard_gamma(shape[, size, dtype, out])標準ガンマ分布から乱数を取得する。
standard_normal([size, dtype, out])標準正規分布から乱数を取得する。
standard_t(df[, size])t分布から乱数を取得する。
triangular(left, mode, right[, size])三角分布から乱数を取得する。
uniform([low, high, size])一様分布から乱数を取得する。
vonmises(mu, kappa[, size])フォン・ミーゼス分布から乱数を取得する。
wald(mean, scale[, size])ワルド分布(逆ガウス分布)から乱数を取得する。
weibull(a[, size])ワイブル分布から乱数を取得する。
zipf(a[,size])ジップ分布から乱数を取得する。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる