天天看點

【Python】Numpy 中的 shuffle VS permutation

有時候我們會有随機打亂一個數組的需求,例如訓練時随機打亂樣本,我們可以使用

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

    ,這點尤其要注意,也就是說沒有傳回值,而

    permutation

    則傳回打亂後的 array。

實作差別

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))           

複制

結果:

【Python】Numpy 中的 shuffle VS permutation

右鍵在新标簽頁打開檢視大圖

可以看出在達到 10910^9 級别以前,兩者速度幾乎沒有差别,但是在 達到 10910^9 以後兩者速度差距明顯拉大,

shuffle

的用時明顯短于

permutation

是以在 array 很大的時候還是使用

shuffle

速度更快些,但要注意其不傳回打亂後的 array,是 inplace 修改。

END