2013-10-22 9 views
5

scipy.random.rand()と同じパッケージ内の他の関数 すべては出力としてfloat64の配列を生成します (少なくともPython 2.7.3では64ビットMacではOS、scipyバージョン0.12.0)。floppy32行列をnumpy/scipyで乱数で初期化

浮動小数点32のかなり大きい(Nギガバイト)ランダムに初期化された行列です。 float64にダブルスペース を割り当ててから、32ビットに変換するのではなく、簡単に直接作成する方法はありますか?

+0

PythonとSciPyのバージョンは無関係です。これらの関数はNumPyに由来し、SciPyによってのみ再エクスポートされます。 –

+1

FYI: "歴史的な理由"のために、scipyはnumpyの多くを 'scipy'名前空間にインポートします。 'scipy.random'は実際には' numpy.random'です。 –

+3

しかし、これらの関数のどれにも 'dtype'引数がないので、' float32'を直接得る方法はないようです。残念です。 –

答えて

4

私は配列をあらかじめ割り当てておき、Warren Weckesserがコメントに推奨しているようにランダムfloat64のバッチでコピーします。

あなたがハックのためにしている場合は、ここでは一様ランダムビットを使用して生成された10台の山車だ:これらは任意の素敵な分布に従わない、配列がNaNまたはInfのが含まれているかもしれません、もちろん

>>> 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) 

、およびx86以外のマシンでは、問題が原因でコードが実際にクラッシュする可能性があります。

+2

ディストリビューションが何であれ気にしない場合は、 'np.float64'の長さの半分のランダムな配列を作成し、' .view(np.float32) 'とします。しかしそれはおそらく正しいサイズの 'np.empty'配列を直接作成するよりもあまり良くありません... – Jaime

+2

@Jaime:非常に大きい' np.empty'がスペースを 'mmap'することを除いて(' malloc'実装)、私はその場合にすべてゼロのバッファを与える少なくとも1つのオペレーティングシステムを知っています。また、あなたのソリューションはCコードで未定義の動作を引き起こします:) –