【发布时间】:2019-05-18 16:41:33
【问题描述】:
我有一个关于 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 的 cmets 后,我发现了问题所在。 - 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
【问题讨论】:
-
能否请您提供一个固定的种子和您的代码(发生这种情况的位置),以便我们重现问题?
-
不知道你发生了什么,但我仍然得到了预期的结果。你能显示完整的代码吗?
-
如果您创建了一个 minimal, complete and verifiable example,我们可以简单地复制并运行(无需编辑)以尝试重现问题,那么有人会更容易帮助您。
-
好的,我将添加固定种子的代码和结果。
-
您对设置的描述或您显示的最后一个输出块有问题。输出中的文件名前缀不断变化。它以“/results/x2/0007.png”开始,这就是你所说的设置它,但随后它不断增加,首先到“/results/x2/0055.png”,然后一直到“/结果/x2/0147.png”。您是否复制/粘贴了错误的内容?
标签: python numpy random shuffle seed