为什么np.random.default_rng()。permutation(n)比原始np.random.permutation(n)更受青睐?

时间:2020-06-17 19:24:21

标签: python numpy numpy-random

np.random.permutation上的

Numpy documentation建议所有新代码使用随机生成器软件包中的np.random.default_rng()。我在文档中看到,Random Generator软件包已经标准化了BitGenerator与使用我熟悉的Mersenne Twister周围的各种随机分布的生成。

我看到一个缺点,它曾经是执行简单排列的单行代码:

np.random.permutation(10)

现在变成两行代码,对于这样一个简单的任务来说有点尴尬:

rng = np.random.default_rng()
rng.permutation(10)
  • 为什么这种新方法比以前的方法有所改进?
  • 为什么np.random.permutation这样的现有方法不会只包装这种新的首选方法?
  • 假设没有大量调用此新方法,是否有充分的理由不使用此新方法?{li>
  • 是否存在用于将现有代码切换到该方法的参数?

1 个答案:

答案 0 :(得分:1)

某些上下文:

按逻辑顺序向您提出问题:

为什么不像np.random.permutation这样的现有方法只包装这种新的首选方法?

可能是因为backwards compatibility concerns。即使“顶级” API不会发生变化,其内部结构也足够显着,可以被视为兼容性中断。

为什么这种新方法比以前的方法有所改进?

“默认情况下,Generator使用PCG64提供的位,该位具有比RandomState中使用的旧版MT19937更好的统计属性。” (source)。 PCG64文档字符串提供了更多技术细节。

假设没有大量调用这种新方法,是否有充分的理由不使用这种新方法?{p}

我非常同意,如果是在模块开始时完成的,那么这行代码会有些尴尬。我只会指出NumPy文档确实在文档字符串示例中直接使用了这种形式,例如:

np.random.default_rng().permutation(10)

稍有不同的是,它是在模块加载/导入时实例化一个类,而在您的表单中,它可能会稍后出现。但这应该是微小的差异(再次,假设它仅使用一次或几次)。如果您查看default_rng(seed)源,当用n = np.random.default_rng().standard_exponential((3, 8000)) 进行调用时,它会在对None进行几次快速检查后才返回Generator(PCG64(seed))

是否存在将现有代码切换到该方法的参数?

之所以要继续进行下去,是因为我没有足够的技术知识来对算法进行很好的比较,而且还因为它取决于其他一些变量,例如您是否担心自己制作下游代码与NumPy的较早版本(其中seed根本不存在)的兼容性。