HOWTO · NumPy
NumPy の numpy.random.permutation()関数
numpy.random.permutation()関数は、配列のランダムに並べ替えたコピーを返すか、整数が渡された場合は並べ替えた整数の範囲を返し、元のデータは変更しません。これは、配列をインプレースでシャッフルするnumpy.random.shuffle()とは異なります。
このページの内容
numpy.random.permutation()はシーケンスをランダムに並べ替えるか、並べ替えた範囲を返します。配列を渡すと、その配列のシャッフルされたコピーを返し、元の配列はまったくそのまま残ります。整数nを渡すと、0からn - 1までの整数をランダムな順序で返します。この「変更ではなくコピー」という振る舞いこそが、配列をインプレースでシャッフルするnumpy.random.shuffle()との違いのすべてです。
元の配列を変更せずに並べ替える
配列の場合、permutation()は同じ要素をランダムな順序で保持する新しい配列を構築します。
import numpy as np
original_array = np.array([1, 2, 3, 4, 5])
shuffled_array = np.random.permutation(original_array)
print("Original Array:", original_array)
print("Shuffled Array:", shuffled_array)
出力:
Original Array: [1 2 3 4 5]
Shuffled Array: [3 1 5 2 4]
shuffled_arrayの順序はランダムであるため、上記の出力は可能な結果の1つであり、すべての実行が生成するものではありません。変化しないのはoriginal_arrayです。これは依然として[1 2 3 4 5]を保持しています。そのため、元の順序が後でも重要な場合、たとえばデータセットがそのラベルと揃ったままでなければならない場合に、permutation()が適切な選択となります。
整数の場合、permutation()は並べ替えた範囲を返します。これはランダムなインデックスを得る便利な方法です。
import numpy as np
n = 5
permuted_indices = np.random.permutation(n)
print("Permuted Indices:", permuted_indices)
出力:
Permuted Indices: [4 0 2 3 1]
ここでも、正確な順序は実行ごとに異なります。整数を渡すことは、np.arange(n)で先に範囲を構築し、その配列を並べ替えることと等価です。
permutation() と shuffle() の比較
この2つの関数は、返すものとデータに対して行うことが異なります。permutation()は新しい配列を返し、その入力には決して触れません。numpy.random.shuffle()は何も返さず、配列自体をインプレースで並べ替えます。
import numpy as np
original_array = np.array([1, 2, 3, 4, 5])
np.random.shuffle(original_array)
print("Shuffled Original Array:", original_array)
出力:
Shuffled Original Array: [2 5 1 4 3]
この呼び出しの後、元の順序は失われます。元の順序が必要なく、インプレースで並べ替えたい場合はshuffle()を選んでください。元の配列が残らなければならない場合はpermutation()を選んでください。コピーの実用的な帰結の1つとして、大規模なデータセットではpermutation()は2番目の配列のためのメモリを必要とするため、データが大きい場合はその便利さと追加のメモリを天秤にかけてください。