【问题标题】:Generate normal random numbers in float32/16 in-place在 float32/16 中就地生成正常的随机数
【发布时间】:2014-03-26 20:02:43
【问题描述】:

在 Numpy/Scipy 中,如何从具有指定(浮点)dtype 的正态分布生成随机数?就我而言,我需要float32float16

由于数组很大,我不想采样后转换数组。

例如:

a = np.random.normal(1e7).astype('float16')

可以完成这项工作,但由于它需要一个临时 float64 数组,因此它使用的 RAM 是直接 float16 采样的 4 倍。

【问题讨论】:

    标签: python random numpy scipy


    【解决方案1】:

    Random Generator 中的standard_normal 现在支持dtype 参数。

    >>> import numpy as np
    >>> rng = np.random.default_rng()
    >>> rng.standard_normal(10, dtype=np.float32)
    array([ 1.0513772 ,  0.471835  ,  0.22101597, -0.5053934 , -0.33512875,
           -0.20794971, -0.2699952 , -1.2080398 , -0.16769128,  1.3502929 ],
          dtype=float32)
    

    【讨论】:

      【解决方案2】:

      我不知道 numpy 或 scipy 中的随机数生成器可以本地生成 16 位或 32 位浮点数。

      为避免大的临时性,您可以批量生成值。例如,下面创建了一个包含 10000000 个 float16 值样本的数组。

      In [125]: n = 10000000  # Number of samples to generate
      
      In [126]: k = 10000     # Batch size
      
      In [127]: a = np.empty(n, dtype=np.float16)
      
      In [128]: for i in range(0, n, k):
         .....:     a[i:i+k] = np.random.normal(loc=0, scale=1, size=k)
         .....:
      

      【讨论】:

      • 我接受这个答案,因为精确的就地操作是不可能的,这个解决方案是在不使用太多 RAM 的情况下生成大量随机数的最佳方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多