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
这样的现有方法不会只包装这种新的首选方法?答案 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
根本不存在)的兼容性。