np.random.shuffle()+random.seed()设定随机种子,多次打乱,打乱规则固定

在打乱数据集的时候遇到了这样一个问题:我有两组数据集,一组是image,一组是mask(语义分割任务,与本文无关),image和mask里都是图片,且一一对应,即image里的第一张图片对应mask里的第一张图片,不能乱,因此打乱数据集的时候要对image和mask以同样的顺序打乱

比如,我有数组

a=[1,2,3,4,5]

b=["a","b","c","d","e"]

1对应“a”,2对应“b”…打乱以后,应该是(比如

a=[5,3,4,2,1]

b=["e","c","d","b","a"],1和“a”、2和“b”之间的位置仍然是对应的

np.random提供了shuffle函数,用来打乱数组。但shuffle每次打乱的顺序是随机的:np.random.shuffle()+random.seed()设定随机种子,多次打乱,打乱规则固定_第1张图片

这样得到的结果,第一轮1对应“b”,第二轮1对应“e”明显对应关系乱了。

本来以为shuffle会提供一个形参,对应随机种子,控制每次的打乱顺序(像train_test_split那个函数一样),但查了官网,木有,shuffle只接受一个输入参数:

np.random.shuffle()+random.seed()设定随机种子,多次打乱,打乱规则固定_第2张图片

 那咋办嘞?random其实还提供了seed函数,用于固定离它最近的那个函数的随机状态(并不完全准确,下面的例子会说明)。听着可能有点拗口,看下面这个例子就好理解了~

        当只添加一个seed。假设一个seed能够作用于全域,那么a和b打乱规则应相同,打乱后仍应该保持对应关系,但结果显然不是。仔细观察可以发现,其实三次shuffle(a)都是按同一规则打乱的(第三个数变为第一个,第四个数变为第二个,第一个数变为第三个,第五个数变为第四个,第二个数变为第五个)。注意,因为shuffle函数是在原数组上直接操作的,不是生成一个新的打乱的数组,因此一次shuffle(a)之后,a就变成了打乱后的样子(如图,第二次循环打乱其实也是按照上述的规则打乱的,只不过是基于第一次循环打乱的结果)。由此可见,seed成功使离其最近的shuffle(a)使用了固定的打乱规则。

        但为什么上文说,seed用于固定离它最近的那个函数的随机状态是不完全准确的呢?其实,三次shuffle(b)也是按相同的规则打乱的,但该规则不同于shuffle(a)的规则,因此,并不能保留a、b之间的对应关系。

        对比没有添加seed的结果,添加了一个seed,能够使每个shuffle保持各自的打乱规则,但不能将每个shuffle的打乱规则统一。(我对这个结果并不很理解,还望大佬指出,感谢~)

np.random.shuffle()+random.seed()设定随机种子,多次打乱,打乱规则固定_第3张图片

 给每个shuffle都提供一个seed,诶,这样就可以了~

也是基于这个结果,我得出(seed函数,用于固定离它最近的那个函数的随机状态)的结论,但基于上面的结果,好像这句话又不完全对,还望大佬指正~

 np.random.shuffle()+random.seed()设定随机种子,多次打乱,打乱规则固定_第4张图片

 

你可能感兴趣的:(PYTHON杂项,python,numpy,开发语言)