奇怪的 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
的更改是混乱的根源。 ix1
和 ix2
继续彼此同步变化,但 imlist
的顺序在每个循环开始时刷新。因为,例如,ix1
和 imlist
在大多数循环开始时以不同的顺序开始(除第一个之外),当然 shuffle 将以不同的顺序离开它们,无论随机种子。
我有一个关于 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
的更改是混乱的根源。 ix1
和 ix2
继续彼此同步变化,但 imlist
的顺序在每个循环开始时刷新。因为,例如,ix1
和 imlist
在大多数循环开始时以不同的顺序开始(除第一个之外),当然 shuffle 将以不同的顺序离开它们,无论随机种子。