带种子的 np.random.permutation 是什么?

27

我想使用一个种子(seed)与np.random.permutation一起,例如:

np.random.permutation(10, seed=42)

我遇到了以下错误:

"permutation() takes no keyword arguments"

还有别的方法吗?谢谢。

4个回答

65
如果你想要一行代码实现,可以创建一个新的RandomState对象,并在其上调用permutation函数。
np.random.RandomState(seed=42).permutation(10)

这比仅设置np.random的种子要好,因为它只会产生局部影响。

NumPy 1.16 更新:

RandomState现在被视为遗留功能。我没有看到它会很快被弃用的迹象,但现在生成可重现随机数的推荐方式是通过随机生成器,其中默认生成器可以这样实例化:

np.random.default_rng(seed=42).permutation(10)

请注意,对于这个生成器来说,在不同版本的NumPy中似乎没有比特流等价性的保证,而对于RandomState,文档中指出"该生成器被认为是冻结的,并且不会有进一步的改进。它保证产生与NumPy v1.16最终发布版本相同的值。"

33
np.random.seed(42)
np.random.permutation(10)
如果您想多次调用 np.random.permutation(10)并获得相同的结果,每次调用 permutation()之前还需要调用np.random.seed(42)
例如,
np.random.seed(42)
print(np.random.permutation(10))
print(np.random.permutation(10))

会产生不同的结果:

[8 1 5 0 7 2 9 4 3 6]
[0 1 8 5 3 4 7 9 6 2]

np.random.seed(42)
print(np.random.permutation(10))
np.random.seed(42)
print(np.random.permutation(10))

将会产生相同的输出:

[8 1 5 0 7 2 9 4 3 6]
[8 1 5 0 7 2 9 4 3 6]

4
在前一行设置种子。
np.random.seed(42)
np.random.permutation(10)

1
你可以将其分解为:
import numpy as np
np.random.seed(10)
np.random.permutation(10)

通过首先初始化随机种子,这将确保您获得相同的排列。

4
这个答案不完整。请参考Giorgos的答案获取更多细节。 - lenhhoxung
似乎我们每次都需要重置随机种子,以确保获得相同的随机数。 - WY Hsu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接