【问题标题】:Strange numpy random shuffle and seed [closed]奇怪的numpy随机洗牌和种子[关闭]
【发布时间】: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


【解决方案1】:

因此,正如您所说,对imlist 的更改似乎是造成混乱的根源。 ix1ix2 继续彼此同步更改,但 imlist 的顺序在每个循环开始时都会刷新。因为,例如,ix1imlist 在大多数循环开始时以不同的顺序开始(除了第一个),当然 shuffle 将使它们以不同的顺序排列,而不管随机种子如何。

【讨论】:

  • 谢谢。我不知道idx应该刷新为imlist。
  • 很高兴能提供帮助。我应该说,虽然试图通过操纵随机种子来保持一个随机列表的索引是一种奇怪的方法,而且可能会导致更多的错误。通过使imlist 成为(index, filename) 形式的元组列表,您可以更轻松地获得所需的内容,然后对其进行改组。这是一种更简单的方法来保持索引与打乱后的文件名相关联。
  • 感谢您的推荐。我会遵循这种洗牌。
猜你喜欢
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 2016-04-26
  • 1970-01-01
  • 2010-12-03
相关资源
最近更新 更多