2013-10-22 72 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代碼中引發未定義的行爲:) –