【问题标题】:Direct way to access Numpy RandomState object直接访问 Numpy RandomState 对象的方法
【发布时间】:2017-12-24 17:24:14
【问题描述】:

除了np.random.<some function>.__self__ 之外,还有更直接的方法来访问在导入时创建的RandomState 对象吗? np.random._randgetattr(np.random, "_rand") 都提高了 AttributeError。前者工作正常,但似乎不是很透明/Pythonic,尽管最透明的可能只是创建一个单独的 RandomState 对象。目的是将interal_state 变量传递给直接调用randomkit 函数的cython 函数。

【问题讨论】:

  • 我明白了,该页面上的第二个答案给了我正在寻找的答案。面向未来是 .__self__ 的一个很好的论据。谢谢。
  • 据我所知,__self___rand 是访问实际全局 RandomState 对象的唯一方法。通常创建一个新实例并使用它会更好(而且更 Pythonic :))。
  • 我认为这就是我要做的,如果我的函数接受随机状态对象作为参数,这也使得单元测试更容易。

标签: python numpy cython numpy-random


【解决方案1】:

感谢 kazemakase 找到答案:_rand 可以直接访问,我只需要导入 mtrand。但如果语法不变,__self__ 可能更适合未来。

【讨论】:

    【解决方案2】:

    您可以使用np.random.get_state() 访问随机状态并使用np.random.set_state() 进行设置。

    示例用法:

    >>> import numpy as np
    >>> state = np.random.get_state()
    >>> np.random.rand()
    0.5951085367670415
    >>> np.random.set_state(state)
    >>> np.random.rand()
    0.5951085367670415
    

    注意state 只是一个元组

    >>> state
    ('MT19937', array([3133054952,  999208925, 1226199620, ..., 3991712371,  943990344,
        955790602], dtype=uint32), 624, 0, 0.0)
    

    【讨论】:

    • 然后我必须自己(重新)创建 c 级对象。为什么,当它已经存在时。我想我的问题是为什么它(更)不容易访问。
    • 你想对 ti 做什么,这是不允许你做的?
    • 调用需要 rk_state C 类型变量的 C 函数(通过 Cython)(除非我将对象从 Python 传递回 C)
    • 什么 C 函数需要原始 C 状态?
    • randomkit 中的任何 C 函数,都需要指向 rk_state 类型的指针。我计划在每个进程中让多个线程共享内存,所以我想发布 GIL 用于主要的计算工作(它是一个统计程序)。
    猜你喜欢
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2016-08-12
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多