奇怪的 numpy 随机洗牌和种子

Strange numpy random shuffle and seed

我有一个关于 numpy 的随机问题,尤其是 shuffle 和 seed。

'seed'用于生成相同的随机序列

'shuffle' 用于洗牌。

要以相同的顺序打乱两个列表,此代码有效:

idx = [1, 2, 3, 4, 5, 6]  
idx2 = [1, 2, 3, 4, 5, 6]  

seed = np.random.randint(0, 100000)  

np.random.seed(seed)  
np.random.shuffle(idx)  
np.random.seed(seed)  
np.random.shuffle(idx2)  

结果:

[1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6]  
[5, 3, 1, 2, 4, 6] [5, 3, 1, 2, 4, 6]  
[1, 5, 3, 2, 4, 6] [1, 5, 3, 2, 4, 6]  
[2, 5, 3, 4, 6, 1] [2, 5, 3, 4, 6, 1]  
[2, 5, 6, 3, 4, 1] [2, 5, 6, 3, 4, 1]  
[4, 5, 6, 1, 2, 3] [4, 5, 6, 1, 2, 3]  

我可以检查此代码是否运行良好。

...省略

解决了,但是问题没说清楚
重新定义简化版的问题:

idx = [1, 2, 3, 4, 5, 6]
for i in range(10):
    seed = np.random.randint(0, 10000)
    idx2 = [1, 2, 3, 4, 5, 6]
    np.random.seed(seed)
    np.random.shuffle(idx)
    np.random.seed(seed)
    np.random.shuffle(idx2)

然后,对于每次迭代,idx != idx2 是明确的。
- 问题是这样的:为什么 idx 和 idx2 不一样?

但是,我没有注意到idx2 的重新初始化。 (实际上,原始代码并不这么简单 - 对于每次迭代,idx2 都会获取新的图像目录。 - "imlist" 在答案中扮演与简化版本中的 idx2 相同的角色。)

看了@tel的评论,我发现了问题所在。 - idx 也应该重新初始化或只使用基于索引的改组。

固定版本

for i in range(10):
    seed = np.random.randint(0, 10000)
    idx2 = [1, 2, 3, 4, 5, 6]
    idx = [1, 2, 3, 4, 5, 6]
    np.random.seed(seed)
    np.random.shuffle(idx)
    np.random.seed(seed)
    np.random.shuffle(idx2)

那么,idx == idx2 : True

所以看起来,正如您所说,对 imlist 的更改是混乱的根源。 ix1ix2 继续彼此同步变化,但 imlist 的顺序在每个循环开始时刷新。因为,例如,ix1imlist 在大多数循环开始时以不同的顺序开始(除第一个之外),当然 shuffle 将以不同的顺序离开它们,无论随机种子。