在打亂數(shù)據(jù)集的時候遇到了這樣一個問題:我有兩組數(shù)據(jù)集,一組是image,一組是mask(語義分割任務(wù),與本文無關(guān)),image和mask里都是圖片,且一一對應(yīng),即image里的第一張圖片對應(yīng)mask里的第一張圖片,不能亂,因此打亂數(shù)據(jù)集的時候要對image和mask以同樣的順序打亂。
比如,我有數(shù)組
a=[1,2,3,4,5]
b=["a","b","c","d","e"]
1對應(yīng)“a”,2對應(yīng)“b”…打亂以后,應(yīng)該是(比如
a=[5,3,4,2,1]
b=["e","c","d","b","a"],1和“a”、2和“b”之間的位置仍然是對應(yīng)的
np.random提供了shuffle函數(shù),用來打亂數(shù)組。但shuffle每次打亂的順序是隨機(jī)的:
這樣得到的結(jié)果,第一輪1對應(yīng)“b”,第二輪1對應(yīng)“e”明顯對應(yīng)關(guān)系亂了。
本來以為shuffle會提供一個形參,對應(yīng)隨機(jī)種子,控制每次的打亂順序(像train_test_split那個函數(shù)一樣),但查了官網(wǎng),木有,shuffle只接受一個輸入?yún)?shù):
?那咋辦嘞?random其實(shí)還提供了seed函數(shù),用于固定離它最近的那個函數(shù)的隨機(jī)狀態(tài)(并不完全準(zhǔn)確,下面的例子會說明)。聽著可能有點(diǎn)拗口,看下面這個例子就好理解了~
? ? ? ? 當(dāng)只添加一個seed。假設(shè)一個seed能夠作用于全域,那么a和b打亂規(guī)則應(yīng)相同,打亂后仍應(yīng)該保持對應(yīng)關(guān)系,但結(jié)果顯然不是。仔細(xì)觀察可以發(fā)現(xiàn),其實(shí)三次shuffle(a)都是按同一規(guī)則打亂的(第三個數(shù)變?yōu)榈谝粋€,第四個數(shù)變?yōu)榈诙€,第一個數(shù)變?yōu)榈谌齻€,第五個數(shù)變?yōu)榈谒膫€,第二個數(shù)變?yōu)榈谖鍌€)。注意,因?yàn)閟huffle函數(shù)是在原數(shù)組上直接操作的,不是生成一個新的打亂的數(shù)組,因此一次shuffle(a)之后,a就變成了打亂后的樣子(如圖,第二次循環(huán)打亂其實(shí)也是按照上述的規(guī)則打亂的,只不過是基于第一次循環(huán)打亂的結(jié)果)。由此可見,seed成功使離其最近的shuffle(a)使用了固定的打亂規(guī)則。
? ? ? ? 但為什么上文說,seed用于固定離它最近的那個函數(shù)的隨機(jī)狀態(tài)是不完全準(zhǔn)確的呢?其實(shí),三次shuffle(b)也是按相同的規(guī)則打亂的,但該規(guī)則不同于shuffle(a)的規(guī)則,因此,并不能保留a、b之間的對應(yīng)關(guān)系。
? ? ? ? 對比沒有添加seed的結(jié)果,添加了一個seed,能夠使每個shuffle保持各自的打亂規(guī)則,但不能將每個shuffle的打亂規(guī)則統(tǒng)一。(我對這個結(jié)果并不很理解,還望大佬指出,感謝~)
?給每個shuffle都提供一個seed,誒,這樣就可以了~
也是基于這個結(jié)果,我得出(seed函數(shù),用于固定離它最近的那個函數(shù)的隨機(jī)狀態(tài))的結(jié)論,但基于上面的結(jié)果,好像這句話又不完全對,還望大佬指正~
?文章來源:http://www.zghlxwxcb.cn/news/detail-443054.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-443054.html
到了這里,關(guān)于np.random.shuffle()+random.seed()設(shè)定隨機(jī)種子,多次打亂,打亂規(guī)則固定的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!