[Python]ランダムな配列を操作する(作成、ランダム取得)

本記事では、Pythonの「ランダムな配列を作成する処理」「配列からランダムに要素を取得する」処理の基本的な使い方を紹介します。

こんな人におすすめ

標準ライブラリrandomを使ってランダムな配列を作成したい。
Numpyでランダム配列を作りたい。
タプルからランダムな要素を取得したい。
文字列からランダムな要素を取得したい。
配列から要素を復元抽出(重複ありで取得)したい。
配列から要素を非復元抽出(重複なしで取得)したい。

主なライブラリ

random
numpy

本ページで使用するライブラリをインポートするときは以下のコードを使用します。

import random
import numpy as np

標準ライブラリ(random)を使用してランダムな配列を作成する。

randomライブラリを使って、ランダムな配列を作成します。
1~20の数字をランダムに取得し、配列(List1)に10個追加することでランダム配列を作成します。

List1 = []
# 1~100までの数字をランダムに選んでList1に10個追加する。
for i in range(10):
    # 1~100までの数字をランダムに抽出しnumに格納
    num = random.randint(1,20)

    # List1にnumを追加
    List1.append(num)

print(List1)
# [16, 10, 7, 13, 12, 19, 18, 13, 5, 1]

numpyライブラリを使用してランダムな配列を作成する。

numpyライブラリを使って、ランダムな配列を作成します。
1~20の数字をランダムに取得し、配列(List2)に10個追加することでランダム配列を作成します。

List2 = []
for i in range(10):
    # 1~20までの数字をランダムに抽出しnumに格納
    num = np.random.randint(1,21)

    # List2にnumを追加
    List2.append(num)

print(List2)
# [17, 17, 15, 14, 3, 13, 19, 17, 5, 18]

復元抽出(重複有り)で配列からランダムに複数の要素を取得する。

ある配列から重複有りで指定の数の要素を取得します。
以下の例では、List1から3つ、5つ、10つの要素を重複有りで取得しています。

List1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# ランダムに3つ要素を取得する(重複有り)
print(random.choices(List1, k=3))
# [3, 8, 5]

# ランダムに5つ要素を取得する(重複有り)
print(random.choices(List1, k=5))
# [7, 4, 1, 5, 4]

# ランダムに10つ要素を取得する(重複有り)
print(random.choices(List1, k=10))
# [8, 2, 2, 1, 3, 4, 7, 3, 10, 5]

復元抽出(重複有り)で配列から、抽出されやすさを指定して複数の要素を取得する。

random.choicesには、重みを指定することができる引数が準備されています。
weightsを指定すると、配列の要素ごとに重みを設定することができます。
weightsが大きい要素ほど、選ばれやすくなります。

# weights(重み)を設定。重みが大きい数値が選ばれやすい
List1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
weights1 = [1, 2, 3, 5, 8, 8, 5, 3, 2, 1]
print(random.choices(List1, weights=weights1, k=10))
# [4, 10, 5, 6, 6, 3, 3, 7, 5, 5]

cum_weightsを指定すると、配列の要素ごとに累積重みを設定することができます。
累積重みでは、前の要素との累積重みの差が大きいほど選ばれやすくなります。
以下の例では、前の要素との累積重みの差が大きい8が一番多く選ばれています。

# cum_weights(累積重み)を設定。重みが大きい数値が選ばれやすい
List1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
cum_weights1 = [1, 1, 2, 3, 5, 8, 13, 21, 22, 23]

print(random.choices(List1, cum_weights=cum_weights1, k=20))
# [10, 8, 8, 8, 7, 6, 8, 5, 10, 6, 5, 1, 8, 7, 8, 3, 8, 5, 5, 6]
# 前の重みとの差が小さいと重みが小さくなるので選ばれにくい

重複なしで配列からランダムに要素を取得する。(非復元抽出)

ある配列から重複無しで指定の数の要素を取得します。
以下の例では、List1から5つ、10つの要素を重複有りで取得しています。

List1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 重複しない5つの要素を取得
print(random.sample(List1, 5))
# [6, 9, 1, 7, 4]

# 重複しない10つの要素を取得
print(random.sample(List1, 10))
# [3, 5, 7, 10, 9, 6, 2, 8, 4, 1]

重複無しで抽出するため、List1の要素より大きな数字を設定するとエラーになります。

# 配列より多い要素を引数に設定するとエラーになる。

print(random.sample(List1, 11))
# ValueError: Sample larger than population or is negative