2013-10-22 70 views
5

scipy.random.rand()和其他函数在同一个包中 都产生float64数组作为输出 (至少对于python 2.7.3 64位Mac OS,scipy版本0.12.0)。用numpy/scipy中的随机数初始化一个float32矩阵

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

+0

Python和SciPy版本无关。这些功能来自NumPy,只能由SciPy重新导出。 –

+1

供参考:呃,“历史原因”,scipy将大量的numpy导入到'scipy'命名空间中。 'scipy.random'实际上是'numpy.random'。 –

+3

但是不,似乎没有办法直接得到'float32',因为这些函数中没有'dtype'参数。这太遗憾了。 –

回答

4

我会预先分配数组,然后按Warren Weckesser在评论中推荐的随机批量复制float64

如果你在一个黑客的时候,这里是使用统一的随机位产生10个彩车:

>>> 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机器上崩溃。

+2

如果你不关心分布是什么,那么创建一个半长度的随机数组,然后'.view(np.float32)'它。但是,这可能不会比直接创建大小合适的“np.empty”数组好多少...... – Jaime

+2

@Jaime:除了一个非常大的'np.empty'可能会'mmap'空间(取决于'malloc'实现),并且我知道至少有一个操作系统会在这种情况下给你一个全零的缓冲区。此外,您的解决方案在C代码中引发未定义的行为:) –