Generator.uniform – 連続一様分布から任意の範囲の乱数配列を作成する方法

Generators.uniformは、NumPyのrandomモジュールで連続一様分布の乱数配列を生成するためのジェネレータメソッドです。

これと同じ操作は、NumPyのversion1.17まではrandom.uniform関数で行っていました。しかし現在では、default_rng で作成したインスタンス(「ジェネレータオブジェクト」とも言う)に対して、integers メソッドを呼び出すことで行うようになりました。

なお、default_rng については、『numpy.random.default_rng – 乱数生成のためのジェネレータオブジェクトの作成』で解説しているので確認しておいて下さい。

このページでは、このGenerators.uniformの使い方を解説します。こちらの方が従来の関数を使った乱数生成よりも大幅に高速で、大量のデータを扱う科学技術計算に適していますので、ぜひ抑えておきましょう。

目次

1. 書式

Generator.uniform

書き方:

Generator.uniform(low=0, high=1.0, size=None)

パラメーター:

low: float or array_like of floats, optional
乱数の最小値を指定。生成される乱数は、全てこの最小値以上の数値になる(最小値含む)。デフォルト値は0。
high: float or array_like of floats
乱数の最大値を指定。生成される乱数は、全てこの最大値より小さな数値になる(最大値含まない)。デフォルト値は1.0。
size: int or tuple of ints, optional
出力する配列のshapeを指定する。デフォルト値のNoneの場合は出力はスカラーになる。それ以外では、np.broadcast(low, high).sizeの乱数が生成される。

戻り値: 

out: ndarray or scalar
指定した範囲の連続一様分布からの乱数を出力する。

連続一様分布とは

Generators.uniformは任意の範囲の連続一様分布から乱数を取得するメソッドです。「連続一様分布」とは、以下のヒストグラムのように、範囲内の全ての数値が一様に等しく出現するようになっている分布のことです。

In [1]:
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng()
r = rng.uniform(-1.0, 0, 100000)
plt.hist(r)
plt.xlabel('x')
plt.ylabel('frequency')
plt.show()

このコードでは、-1.0以上0.0未満の範囲を指定しています。指定の範囲から全ての数字が等しい確率で取得されていることがわかります。

なお、この一様分布の確率密度関数の式は次の通りです。

2. サンプルコード

ジェネレータメソッドは、すべて default_rng で作成したインスタンスに対して使用します。インスタンスの作成は、以下のコードのように、任意の変数にdefault_rng を代入することで行います。

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

これで、ジェネレータオブジェクトの rng が作成されました。さて、連続一様分布から指定の範囲の中から浮動小数点数の乱数を取得するには、このジェネレータオブジェクト rng に対して uniformメソッドを使います。

最小値lowと最大値highの指定

uniformメソッドは、引数を指定しない場合、0.0以上1.0未満の浮動小数点数の乱数を1つ返します。

In [2]:
rng.uniform()
# >>> 0以上1未満
Out[2]:
0.006935990548532001

引数で任意の数値を1つ指定すると、0.0以上任意の数値未満の乱数を返します。

In [3]:
rng.uniform(5)
# >>> 0以上5未満
Out[3]:
1.6408986813180482

数値を2つ指定すると、その数値の範囲内の乱数を返します。

In [4]:
rng.uniform(10, 11)
# >>> 10以上11未満
Out[4]:
10.798439800061304

size の指定

オプション引数 size= では、出力する配列のshapeを指定します。shapeは『NumPyのshape属性 – 配列の形状の確認と変更』で解説しています。

以下のコードでは、shape(10, )の配列を生成しています。

In [5]:
rng.uniform(size=10)
# >>> 0以上1未満でshape(10, )の配列を生成
Out[5]:
array([0.90691868, 0.3871004 , 0.02129976, 0.82223995, 0.94638641,
       0.45446185, 0.5161357 , 0.81845871, 0.07012278, 0.67856229])

最小値lowと最大値highを指定している場合は、size= を省略して次のように書くことができます。

In [6]:
rng.uniform(-1, 0, 10)
# >>> -1以上0未満でshape(10, )の配列を生成
Out[6]:
array([-0.81093969, -0.88055961, -0.64037494, -0.96291925, -0.79174007,
       -0.91076683, -0.42004354, -0.36922263, -0.23555181, -0.93605596])

2次元配列以上を指定する場合は、shapeをタプルで渡します。タプルについては『Pythonのタプルの基本的操作のまとめ』で解説しています。

In [7]:
rng.uniform(-1, 0, (5, 2))
# >>> -1以上0未満でshape(5, 2)の配列を生成
Out[7]:
array([[-0.63520049, -0.02579375],
       [-0.46422029, -0.46521678],
       [-0.36774746, -0.31623875],
       [-0.44043424, -0.54825458],
       [-0.08727069, -0.75958386]])

3. まとめ

以上が Generators.uniform の使い方です。これまでは、同じ操作をするのに、numpy.random.uniform関数が使われてきましたが、これからはこの Generators.uniform を使うようにしていきましょう。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる