NumPy
前回、PythonのPandasで現れる「FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. 」の警告への対処法を紹介しました。

今回はNumPyのGeneratorを使った場合のリストからランダムに要素を抽出する方法を紹介します。
それでは始めていきましょう。
randomモジュールを使った場合
まず比較のためにrandomモジュールを使った場合のリストからランダムに要素抽出する方法をおさらいします。
randomモジュールを使った場合は「random.choice()」、「random.choices()」、「random.sample()」を用途によって使い分けます。
「random.choice(リスト)」でリストから要素を1つランダムに抽出します。
import random
data = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
print(random.choice(data))
実行結果
d
「random.choices(リスト, k=個数)」でリストから複数個の要素を重複ありで抽出します。
import random
data = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
print(random.choices(data, k=3))
実行結果
['e', 'e', 'c']
「random.sample(リスト, k=個数)」でリストから複数個の要素を重複なしで抽出します。
import random
data = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
print(random.sample(data, k=3))
実行結果
['a', 'e', 'b']
NumPyのGeneratorを使った場合
それではここかrあNumPyのGeneratorを使った場合のリストからランダムに要素抽出する方法を紹介していきます。
まず「np.random.default_rng()」で乱数発生器をインスタンス化します。
そしてランダムに要素を抽出するメソッドを使いますが、実はNumPyのGeneratorでは「rng.choice()」だけです。
リストから要素を1つランダムに抽出する場合は「rng.choice(リスト)」だけ。
import numpy as np
data = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
rng = np.random.default_rng()
print(rng.choice(data))
実行結果
g
リストから複数個の要素を重複ありで抽出する場合は「rng.choice(リスト, size=個数)」とします。
import numpy as np
data = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
rng = np.random.default_rng()
print(rng.choice(data, size=3))
実行結果
['h' 'c' 'c']
リストから複数個の要素を重複なしで抽出する場合は「rng.choice(リスト, size=個数, replace=False)」とします。
import numpy as np
data = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
rng = np.random.default_rng()
print(rng.choice(data, size=3, replace=False))
実行結果
['i' 'h' 'f']
一回の実行結果では分かりませんが、「replace=False」のありなしで「size」をリストより大きくすると「replace=False」がある場合は抽出サイズが多きすぎるというエラーとなるので分かります。
import numpy as np
data = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
rng = np.random.default_rng()
print(rng.choice(data, size=15))
実行結果
['j' 'f' 'j' 'c' 'j' 'b' 'f' 'j' 'd' 'i' 'i' 'd' 'a' 'a' 'f']
import numpy as np
data = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
rng = np.random.default_rng()
print(rng.choice(data, size=15, replace=False))
実行結果
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[8], line 7
3 data = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
5 rng = np.random.default_rng()
----> 7 print(rng.choice(data, size=15, replace=False))
File numpy/random/_generator.pyx:918, in numpy.random._generator.Generator.choice()
ValueError: Cannot take a larger sample than population when replace is False
おまけ:順番をランダムに変えるだけの場合
リストの要素の順番をランダムに変えるだけの場合、「rng.shuffle(リスト)」を使います。
import numpy as np
data = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
rng = np.random.default_rng()
rng.shuffle(data)
print(data)
実行結果
['c', 'j', 'a', 'e', 'd', 'h', 'g', 'b', 'f', 'i']
次回はpyzbarを使ったQRコードの読み取り方法を紹介します。
ではでは今回はこんな感じで。
コメント