python - 如何使用新的 NumPy 随机数生成器?
问题描述
NumPy 现在建议新代码使用defacult_rng()
实例而不是新代码这一事实numpy.random
让我开始思考应该如何使用它来产生良好的结果,无论是性能还是统计。
第一个例子是我最初想写的:
import numpy as np
class fancy_name():
def __init__(self):
self.rg = np.random.default_rng()
self.gamma_shape = 1.0
self.gamma_scale = 1.0
def public_method(self, input):
# Do intelligent stuff with input
return self.rg.gamma(self.gamma_shape, slef.gamma_scale)
但我也考虑过在每个函数调用中创建一个新实例:
import numpy as np
class fancy_name():
def __init__(self):
self.gamma_shape = 1.0
self.gamma_scale = 1.0
def public_method(self, input):
# Do intelligent stuff with input
rg = np.random.default_rng()
return rg.gamma(self.gamma_shape, slef.gamma_scale)
第三种选择是将 rng 作为函数调用中的参数传递。这样,相同的 rng 也可以用于代码的其他部分。
这用于模拟环境中,该环境将经常被调用来采样,例如,转换时间。
我想问题是这三种方法中的任何一种是否存在论据,是否存在某种实践?
此外,任何对使用这些随机数生成器的更深入解释的参考(除了 NumPy 文档和随机采样文章)都非常有趣!
解决方案
default_rng()
不是单身人士。它创建了一个由默认 BitGenerator 类的新实例支持的新生成器。引用文档:
使用默认的 BitGenerator (PCG64)构造一个新的生成器。
...
如果种子不是 BitGenerator 或 Generator,则实例化一个新的BitGenerator。此函数不管理默认全局实例。
这也可以通过经验进行测试:
In [1]: import numpy
In [2]: numpy.random.default_rng() is numpy.random.default_rng()
Out[2]: False
这是昂贵的。您通常应该default_rng()
在程序中调用一次并将生成器传递给任何需要它的东西。(是的,这很尴尬。)
推荐阅读
- python - Python 探查器时间不会累加
- c# - ASP.NET Core .NET 6 预览版 7 Windows 服务
- c - C中的while循环重新打印以前的语句
- c++ - (C++) 读取矩阵文件的最快方式(任意大小)
- intersystems-iris - $Increment 和 $Sequence 函数有什么区别?
- parquet - 如何追加到镶木地板文件以及它如何影响分区?
- android - 滚动屏幕直到列表到达顶部
- docker - docker compose v3 的部署资源的行为限制了“cpus”参数设置(是绝对数量还是可用核心的百分比)
- javascript - 多个车把文件未读取 css 文件
- python - 在给定唯一列值的情况下,熊猫数据框如何删除以小于数字的行长为条件的行?