【问题标题】:initialize a float32 matrix with random numbers in numpy/scipy在 numpy/scipy 中用随机数初始化一个 float32 矩阵
【发布时间】:2013-10-22 16:17:04
【问题描述】:

scipy.random.rand() 和其他函数在同一个包中 都产生 float64 数组作为输出 (至少对于 Mac OS 上的 python 2.7.3 64 位,scipy 版本 0.12.0)。

我想要的是一个相当大的(N GB)随机初始化的 float32 矩阵。 有没有一种简单的方法可以直接生成一个,而不是分配双倍空间 对于 float64 然后转换为 32 位?

【问题讨论】:

  • Python 和 SciPy 版本无关。这些函数来自 NumPy,仅由 SciPy 重新导出。
  • 仅供参考:因为,呃,“历史原因”,scipy 将大部分 numpy 导入到 scipy 命名空间中。 scipy.random实际上是numpy.random
  • 但是不,似乎没有办法直接获得float32,因为这些函数中没有dtype 参数。真可惜。
  • 你可以预先分配大的float32数组,然后分批填充。这仍然会相当快,可以避免同时在内存中同时拥有完整的 float32 和 float64 版本。
  • 谢谢大家。我只是想确认我没有遗漏一些明显的东西。批量填充确实是一种解决方法。

标签: python random numpy scipy


【解决方案1】:

我会预先分配数组,然后按照 Warren Weckesser 在 cmets 中的建议,分批随机复制 float64s。

如果您想破解,这里有十个使用统一随机位生成的浮点数:

>>> bytes_per_float = np.float32(0).nbytes  # ugly, I know
>>> np.frombuffer(random.bytes(10 * bytes_per_float), dtype=np.float32)
array([ -3.42894422e-23,  -3.33389699e-01,  -7.63695071e-26,
         7.02152836e-10,   3.45816648e-18,   2.80226597e-09,
        -9.34621269e-10,  -9.75820352e+08,   2.95705402e+20,
         2.57654391e+25], dtype=float32)

当然,这些不遵循任何良好的分布,数组可能包含 NaN 或 Inf,并且由于对齐问题,代码实际上可能在某些非 x86 机器上崩溃。

【讨论】:

  • 如果您不关心分布是什么,请创建一个长度为np.float64 一半的随机数组,然后创建.view(np.float32) 它。但这可能并不比直接创建一个大小合适的np.empty 数组好多少……
  • @Jaime:除了非常大的np.empty 可能mmap 空间(取决于malloc 实现),我知道至少有一个操作系统可以为您提供所有- 在这种情况下,缓冲区为零。此外,您的解决方案会在 C 代码中引发未定义的行为 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
相关资源
最近更新 更多