Python入門トップページ


目次

  1. NumPy とは
  2. Python リストの場合
  3. NumPy の使用例
  4. NumPy で線形代数
  5. NumPy の乱数生成
    1. NumPy の乱数生成 (Random Generator)
    2. 実数分布
    3. 整数分布
    4. シーケンス用の関数
    5. Legacy な乱数生成 (numpy.random)

NumPy

NumPy の乱数生成

Legacy な乱数生成 (numpy.random)

このページに記載されている情報は【古い情報】です.古い書籍やWebページではこのページの生成方法が記載されていることが少なくありません.まだまだ引き続き利用可能ですが,NumPy 1.17.0 以降のバージョンでは Random Generator を使った乱数生成を利用することをおすすめします.詳細は NumPy の乱数生成 (Random Generator)実数分布整数分布シーケンス用の関数を参照してください.

目次に戻る

random.rand

numpy.random.rand() 関数は,0以上1未満の一様乱数からなる配列を生成できます.このとき numpy.random.rand(n) では長さ n の1次元配列が,numpy.random.rand(m, n) では m × n の2次元配列が作成されます(カッコの数が ones や zeros とは異なることにも注意してください).もちろん,実行するたびに得られる結果は異なるはずです.

numpy.random.randimport numpy as npimport numpy as np
x = np.random.rand(5)
print(x)
[0.66926983 0.48949102 0.70698602 0.64423388 0.33750168]
numpy.random.randX = np.random.rand(2, 3)
print(X)
[[0.95392011 0.878542   0.38367389]
 [0.47355338 0.69579488 0.67895968]]

目次に戻る

random.randint

numpy.random.randint(low, high=None, size=None) 関数は,[low, high) の離散一様乱数からなる配列を生成できます.つまり,low 以上,high 未満の整数の乱数です.なお,high を省略したときは [0, low) となります.このとき numpy.random.rand(a, b, n) では長さ n の1次元配列が,numpy.random.rand(a, b, (m, n)) では m × n の2次元配列が作成されます.もちろん,実行するたびに得られる結果は異なるはずです.

0以上10未満の整数乱数を1つ発生させます.

0以上10未満の整数を1つimport numpy as np
x = np.random.randint(10)
print(x)
3

0以上10未満の整数乱数を10個発生させ,配列形式で返します.

0以上10未満の整数を20個x = np.random.randint(0, 10, 20)
print(x)
[8 3 8 6 6 6 6 4 6 1 4 0 6 4 1 2 7 1 5 3]

0または1の乱数を発生させるには0以上2未満という指定でよい.

0以上2未満.つまり,0-1乱数を10個x = np.random.randint(0, 2, 10)
print(x)
[1 1 1 1 1 1 0 1 0 0]

0または1の乱数を5行4列の行列形式で返すには次のようにします.

0-1乱数を5行4列の行列形式でX = np.random.randint(0, 2, (5, 4))
print(X)
[[1 0 1 0]
 [0 0 0 0]
 [1 0 1 1]
 [1 1 1 0]
 [0 1 0 0]]

この方法では指定した範囲で一様乱数が生成されます.連続しない値の乱数や,値ごとに出現確率が異なるような乱数を生成したい場合は次の random.choice を利用すると良いでしょう.

目次に戻る

random.choice

numpy.random.choice(a, size=None, replace=True, p=None) 関数は,引数の1次元配列 a からランダムに選択した乱数を生成します.

次のコードでは0以上5未満(つまり,[0, 1, 2, 3, 4])から20個のサンプルを抽出します.

[0, 1, 2, 3, 4] から20個を抽出import numpy as npimport numpy as np
np.random.choice(5, size=20)
array([3, 3, 2, 4, 4, 0, 0, 1, 2, 4, 4, 4, 2, 4, 2, 4, 2, 0, 0, 2])

なお,size=20 は単に 20 でも動作します.

[0, 1, 2, 3, 4] から20個を抽出np.random.choice(5, 20)
array([1, 4, 0, 2, 4, 2, 4, 4, 4, 3, 3, 1, 4, 3, 0, 1, 0, 0, 4, 0])

[0, 1, 2, 3, 4] から重複なく3個を選びたい場合は,replace=False を指定します.

重複なく選ぶnp.random.choice(5, 3, replace=False)
array([0, 3, 4])

[0, 1, 2, 3, 4] から重複なく5個を選ぶと,結果的にランダムに並べ替えた(シャッフルした)ことになります.

重複なく選ぶ(シャッフル)np.random.choice(5, 5, replace=False)
array([4, 0, 3, 1, 2])

5個の要素から10個を重複なく選ぶことはできないのでエラーになります.

5個から10個を重複なく抽出することはできませんnp.random.choice(5, 10, replace=False)
ValueError

[0, 1, 2, 3, 4] の出現確率を与えて20個抽出することも可能です.

出現確率を与えて20個np.random.choice(5, 20, p=[0.6, 0.1, 0.1, 0.1, 0.1])
array([0, 0, 0, 0, 4, 2, 0, 0, 2, 2, 0, 2, 1, 0, 1, 3, 0, 0, 0, 0])

[1, 3, 5]という奇数から出現確率を与えて20個抽出します.

[1, 3, 5]から20個をある出現確率でnp.random.choice([1, 3, 5], 20, p=[0.8, 0.1, 0.1])
array([1, 1, 1, 5, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1])

5行4列の0-1行列を1の出現確率が0.2となるように生成します.(これは遺伝的アルゴリズムにおける染色体配列の初期化などにも利用できます.)

1の出現確率が0.2となる5行4列の0-1行列np.random.choice(2, (5,4), p=[0.8, 0.2])
array([[1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 0, 0],
       [1, 1, 1, 0],
       [1, 1, 1, 0]])

目次に戻る

random.shuffle と random.permutation

NumPy 配列をランダムに並べ替えるには random.shufflerandom.permutation などがあります.この2つの違いは random.shuffle は引数に与えた NumPy 配列そのものを並べ替えるのに対して,random.permutation は引数に与えた NumPy 配列を並べ替えて複製した結果を返します.

まず,random.shuffle に1次元配列を与えてランダムに並べ替えます.

import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
np.random.shuffle(a)
print(a)
[9 1 7 6 2 5 4 3 8]

つぎに,random.shuffle に2次元配列を与えてランダムに並べ替えます.

a = np.array([[1, 2, 3],[4, 5, 6], [7, 8, 9]])
np.random.shuffle(a)
print(a)
[[1 2 3]
 [7 8 9]
 [4 5 6]]

一方で,random.permutation は配列を並べ替えた結果を返すので,元の配列 a には影響が及びません.

a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
b = np.random.permutation(a)
print(a)
print(b)
[1 2 3 4 5 6 7 8 9]
[4 9 2 6 5 1 8 3 7]

2次元配列を random.permutation で並べ替えた結果も示します.

a = np.array([[1, 2, 3],[4, 5, 6], [7, 8, 9]])
b = np.random.permutation(a)
print(a)
print(b)
[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[7 8 9]
 [1 2 3]
 [4 5 6]]

目次に戻る