Generator.integers – 離散一様分布から整数の乱数配列を作成する方法

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

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

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

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

目次

1. 書式

Generator.integers

書き方:

Generator.integers(low, high=None, size=None, dtype=np.int64, endpoint=False)

パラメーター:

low: int or array-like of ints
離散一様分布から生成する乱数の最小値を指定する。high=Noneの場合は、最小値が0で、ここで指定した値-1を最大値とする範囲の中で乱数を生成する。
high: int or array-like of ints, optional
離散一様分布から生成する乱数の最大値を指定する。最大値は、ここで指定した数値-1になる。array_likeを渡す場合は、数値(int型)の要素を含んでいなければならない。
size: int or tuple of ints, optional
出力のshapeを指定する。デフォルト値のNoneの場合、整数の値を1つ返す。
endpoint: bool, optional
Trueにした場合は、[low, high]の間で乱数を生成する(highで指定した数値も含む)。デフォルト値のFalseでは、[low, high)であり、生成する乱数の中にhighは含まない。

戻り値: 

out: int or ndarray of ints
整数(int型)の乱数を要素とした指定のshapeの配列。サイズが指定されていない場合はランダムな1つの数値。

離散一様分布とは

繰り返しになりますが、Generators.integersは、指定の数値の範囲の離散一様分布から、整数の乱数を生成するメソッドです。離散一様分布とは、確率分布の一種です。単純な例としてサイコロがよく挙げられます。1回サイコロを振った場合、とりうる値は 1, 2, 3, 4, 5, 6 です。1.2や3.5といったような間の数は存在しません。そのため、それぞれの値が出る確率は1/6で均等です。

以下は、離散一様分布を示したものです。

出典: wikipedia

このように、離散一様分布では指定の範囲の数値内のすべての整数が等しい確率で得られます。

それではサンプルコードで確認していきましょう。

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 に対して integers メソッドを使います。

最小値lowと最大値high

以下のコードでは、最大値の 3 だけを指定しています。そのため、0以上2(3-1)以下の整数の中から、ランダムに1つ返されます。

In [2]:
# 0以上2未満
rng.integers(3)
Out[2]:
2

引数に数値を2つ渡せば、第一引数を最小値、第二引数を最大値とした範囲の数値を返します。以下のコードは最小値10、最大値20なので、10以上19以下の数値が1つ返されます。

In [3]:
# 10以上19以下
rng.integers(10, 20)
Out[3]:
16

次で見るように特殊な指定の仕方をすることもできます。

以下のコードでは、最小値は全て1で、配列のそれぞれの要素ごとに異なる最大値を指定しています。

In [4]:
# 1×3 の配列でそれぞれの要素に異なる最大値を指定
rng.integers(1, [3, 5, 10])
Out[4]:
array([2, 2, 4])

以下のコードでは、最大値は10で、要素ごとに異なる最小値を指定しています。

In [5]:
# 1×3 の配列でそれぞれの要素に異なる最小値を指定
rng.integers([1, 5, 7], 10)
Out[5]:
array([3, 9, 9])

次のように書くことも可能です。

In [6]:
# 2×4 の配列でそれぞれの要素に異なる最小値・最大値を指定
rng.integers([1, 3, 5, 7], [[10], [20]])
Out[6]:
array([[ 4,  3,  9,  7],
       [14, 19,  5, 11]])

解説しておくと、このコードではブロードキャストが適用されて、最小値と最大値が、各行・各列の要素ごとに以下のように指定されています。

形状 size

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

なお、size を指定するには、その前にlowとhighの両方を指定していることが前提です。

以下のコードでは1次元配列を指定しています。

In [7]:
# 最小値最大値、shapeを指定
rng.integers(5, 10, 3)
Out[7]:
array([7, 7, 9])

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

In [8]:
# 2次元配列
rng.integers(5, 10, (3, 2))
Out[8]:
array([[5, 7],
       [9, 6],
       [7, 5]])

endpoint

オプション引数で endpoint = True とすると、生成される乱数の中に最大値も含まれます。以下のコードで、最大値の3が生成された乱数配列の中に含まれていることがわかります。

In [9]:
randoms = rng.integers(0, 3, 100000, endpoint=True)
3 in randoms
Out[9]:
True

3. まとめ

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



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる