Python入門トップページ


目次

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

NumPy

NumPy の乱数生成

シーケンス用の関数

目次に戻る

choice

rng.choice() は与えられた配列からランダムにサンプルを生成します.

まず,0以上5未満(つまり,[0, 1, 2, 3, 4])から100個のサンプルを生成します.

import numpy as np
rng = np.random.default_rng()

rng.choice(5, size=100)
array([0, 2, 4, 0, 3, 4, 3, 4, 0, 1, 0, 2, 3, 2, 4, 4, 3, 0, 3, 2, 1, 1,
       1, 4, 0, 3, 0, 1, 3, 0, 3, 0, 1, 2, 3, 1, 3, 1, 4, 2, 0, 2, 2, 3,
       2, 4, 0, 3, 4, 1, 3, 3, 4, 1, 0, 0, 4, 2, 3, 2, 0, 1, 3, 3, 1, 1,
       1, 1, 4, 3, 0, 0, 2, 0, 4, 1, 3, 0, 1, 3, 2, 2, 1, 1, 4, 2, 4, 0,
       0, 4, 3, 0, 1, 1, 0, 1, 0, 2, 1, 1])

引数の size=100 は単に 100 と書くことも可能です.

rng.choice(5, 100)
array([3, 4, 2, 0, 0, 4, 1, 2, 3, 4, 0, 2, 1, 0, 1, 4, 3, 4, 1, 0, 4, 4,
       4, 3, 2, 4, 0, 1, 2, 4, 1, 2, 4, 0, 1, 4, 1, 2, 4, 2, 0, 0, 2, 4,
       4, 3, 2, 2, 2, 3, 3, 2, 3, 0, 4, 0, 4, 1, 2, 1, 3, 4, 4, 4, 0, 1,
       3, 2, 4, 1, 1, 4, 1, 1, 4, 0, 4, 2, 3, 4, 4, 0, 1, 4, 1, 0, 2, 4,
       4, 0, 0, 1, 1, 4, 3, 0, 1, 2, 3, 2])

リストを生成して,そのリストの中からサンプルを生成することも可能です.例えば,[1, 3, 5] から100個生成します.

a = [1, 3, 5]
rng.choice(a, 100)
array([3, 1, 3, 1, 5, 1, 1, 3, 1, 1, 3, 1, 3, 5, 1, 3, 1, 1, 3, 3, 5, 3,
       3, 3, 5, 1, 3, 3, 1, 3, 3, 5, 3, 1, 3, 3, 5, 1, 3, 3, 1, 1, 3, 3,
       5, 3, 5, 5, 3, 5, 5, 5, 5, 3, 5, 1, 5, 3, 1, 5, 5, 1, 3, 1, 1, 3,
       1, 3, 3, 3, 1, 3, 1, 5, 1, 3, 3, 5, 1, 5, 3, 1, 1, 1, 1, 1, 5, 3,
       5, 5, 1, 5, 5, 3, 1, 5, 1, 3, 1, 5])

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

rng.choice(5, 3, replace=False)
array([3, 1, 4])

なお,[0, 1, 2, 3, 4, 5] から5個選ぶと,結果的にランダムに並べ替えたことになります.

rng.choice(5, 5, replace=False)
array([0, 2, 3, 1, 4])

もちろん [0, 1, 2, 3, 4] という5個の要素から10個を重複なく選ぶことはできないので,エラーになります.

rng.choice(5, 10, replace=False)
ValueError: Cannot take a larger sample than population when replace is False

rng.choice() では各要素が選択される確率を指定することも可能です.例えば [0, 1, 2, 3, 4] から0の選択確率を0.6,その他を0.1として100個選びます.

rng.choice(5, 100, p=[0.6, 0.1, 0.1, 0.1, 0.1])
array([0, 0, 3, 0, 0, 0, 3, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 1, 3, 0, 3, 0,
       0, 4, 0, 3, 0, 0, 0, 2, 1, 2, 0, 2, 0, 0, 0, 0, 4, 0, 0, 3, 0, 0,
       0, 4, 0, 0, 0, 4, 1, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
       3, 0, 1, 4, 0, 2, 0, 1, 0, 2, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 1, 0, 4, 0, 4, 0, 0, 2])

次のように,選択確率をリスト化して与えることも可能です.

a = [1, 3, 5]
p = [0.6, 0.3, 0.1]
rng.choice(a, 100, p=p)
array([1, 1, 5, 3, 1, 1, 3, 1, 3, 5, 3, 3, 5, 1, 1, 1, 1, 1, 1, 3, 1, 3,
       1, 5, 1, 3, 3, 1, 3, 1, 1, 3, 3, 1, 1, 3, 5, 3, 3, 1, 3, 1, 1, 3,
       1, 1, 3, 1, 3, 1, 5, 1, 3, 3, 3, 1, 5, 1, 3, 5, 1, 1, 1, 1, 1, 1,
       1, 3, 5, 3, 5, 1, 1, 1, 1, 1, 3, 1, 3, 1, 3, 1, 1, 1, 3, 1, 3, 1,
       3, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 3])

行列から行を選択することもできます.例えば3行3列の行列から1行をランダムに取り出します.

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

もちろん重複を許せば3行の行列から10行をランダムに取り出すことも可能です.

a = np.arange(1,10).reshape((3, 3)) # 行列の準備はこちらの方が簡単
print(a)
print(rng.choice(a, 10))
[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[4 5 6]
 [7 8 9]
 [1 2 3]
 [1 2 3]
 [4 5 6]
 [1 2 3]
 [1 2 3]
 [4 5 6]
 [7 8 9]
 [4 5 6]]

行列から列を取り出したい場合は axis=1 を指定します.例えば3行3列の行列から2列を取り出します.

a = np.arange(1,10).reshape((3, 3)) # 行列の準備はこちらの方が簡単
print(a)
print(rng.choice(a, 2, axis=1))
[[1 2 3]
  [4 5 6]
  [7 8 9]]
 [[3 2]
  [6 5]
  [9 8]]

目次に戻る

shuffle

shuffle は NumPy 配列をランダムに並べ替えるメソッドです.与えた NumPy 配列そのものを並べ替えることに注意してください.配列を複製してから並べ替えたい場合は permutation を使ってください.

たとえば,0から9までの配列を作成して,これをランダムに並べ替えてみます.

import numpy as np
rng = np.random.default_rng()

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

行列を並べ替えることも可能です.3行3列の行列の行を並べ替えてみます.

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

引数に axis=0 を指定しても行で並べ替えます.

a = np.arange(1,10).reshape((3, 3)) # 行列の準備はこちらの方が簡単
print(a)
rng.shuffle(a, axis=0)
print(a)
[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[4 5 6]
 [1 2 3]
 [7 8 9]]

列で並べ替えたい場合は axis=1 を指定します.

a = np.arange(1,10).reshape((3, 3))
print(a)
rng.shuffle(a, axis=1)
print(a)
[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[3 1 2]
 [6 4 5]
 [9 7 8]]

目次に戻る

permutation

permutation は配列をランダムに並べ替えた結果を返すメソッドです.指定した引数自体を並べ替えたい場合は shuffle を使用してください.

例えば0から9までの配列 a を作成して,これをランダムに並べ替えた結果を b に代入します.このとき,a には変化がないことに注意してください.

import numpy as np
rng = np.random.default_rng()

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

行列を行で並べ替えることも可能です.

a = np.arange(1,10).reshape((3, 3))
b = rng.permutation(a)
print(a)
print(b)
[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[7 8 9]
 [1 2 3]
 [4 5 6]]

引数 axis=1 を指定すると,行列を列で並べ替えることができます.

a = np.arange(1,10).reshape((3, 3))
b = rng.permutation(a, axis=1)
print(a)
print(b)
[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[3 2 1]
 [6 5 4]
 [9 8 7]]

目次に戻る