有時候我們會有随機打亂一個數組的需求,例如訓練時随機打亂樣本,我們可以使用
numpy.random.shuffle()
或者
numpy.random.permutation()
來完成。這兩者非常相似,實作的功能是一樣的,那麼他們到底有什麼差別?
本文代碼及圖檔可以在 我的GitHub 找到。
參數差別
以下
numpy.random.shuffle()
簡稱
shuffle
,
numpy.random.permutation()
簡稱
permutation
。
-
的參數隻能是shuffle
,而array_like
除了permutation
還可以是array_like
類型,如果是int
類型,那就随機打亂int
。numpy.arange(int)
-
傳回shuffle
,這點尤其要注意,也就是說沒有傳回值,而None
則傳回打亂後的 array。permutation
實作差別
permutation
其實在内部實作也是調用的
shuffle
,這點從 Numpy 的源碼 可以看出來:
def permutation(self, object x):
'''這裡都是幫助文檔,我就省略了'''
if isinstance(x, (int, long, np.integer)):
arr = np.arange(x)
else:
arr = np.array(x)
self.shuffle(arr)
return arr
複制
速度差別
為了測試兩者的速度差別,我分别使用了
shuffle
和
permutation
對不同長度的 array 進行随機打亂并計時。
關鍵代碼如下:
n = 10 ** np.arange(1, 10)
shuffle_elapsed = []
permutation_elapsed = []
for i in n:
print(i)
start = time.time()
a = np.arange(i)
np.random.shuffle(a)
end = time.time()
shuffle_elapsed.append((i, end - start))
start = time.time()
b = np.random.permutation(i)
end = time.time()
permutation_elapsed.append((i, end - start))
複制
結果:
右鍵在新标簽頁打開檢視大圖
可以看出在達到 10910^9 級别以前,兩者速度幾乎沒有差别,但是在 達到 10910^9 以後兩者速度差距明顯拉大,
shuffle
的用時明顯短于
permutation
。
是以在 array 很大的時候還是使用
shuffle
速度更快些,但要注意其不傳回打亂後的 array,是 inplace 修改。