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 は 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 は配列をランダムに並べ替えた結果を返すメソッドです.指定した引数自体を並べ替えたい場合は 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]]