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 中的順序是隨機的,所以上面的輸出只是一個可能的結果,而不是每次執行都會產生的結果。不變的是 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()

這兩個函式的區別在於它們返回什麼,以及它們對你的資料做了什麼。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()。複製帶來的一個實際影響是:在大型資料集上,permutation() 需要為第二個陣列準備記憶體,所以當資料很大時,要在這種便利與額外的記憶體之間權衡。