2016-10-18 5 views
0

私は以下のコードを実行すると:なぜ私のコンピュータのメモリよりも(明らかに)大きめの配列を作ることができますか?

import scipy.sparse 
x = scipy.sparse.random(100000, 100000, 1e-4) 
y = x.toarray() 
print(y.nbytes) 

を私は= 80ギガバイト800億バイトの出力を取得します。それでも、私はわずか4 GBのRAMを搭載したMacbook Airを使用しています。私の記憶容量よりも大きなNumPy配列を(どうやら)作成しているのか誰かが説明できますか? yは何とかコピーではなくxのビューですか? scipy.sparseのドキュメントでこれについて何も見つかりませんでした。当然、私がy.copy()のようなことをすれば、私はPythonをクラッシュします...サイズ10^10の配列に何かをすることは期待できません。ありがとう!

バージョン: Python 3.5.2 via Anaconda 4.1.1、SciPy 0.17.1、NumPy 1.11.1。

答えて

0

これは、numpyが実際にすべての領域を割り当てるわけではないためです。ほとんどの場合、希薄な配列と行列は、triplets, linked nodes、またはその間のすべての空白を無視するその他の手段で表されます。バイトは、メモリ内の実際のデータではなく、行列/配列の割り当てられた次元に基づいて計算されます。

+0

'x'は疎行列型なので、上記のことが当てはまります。しかし、 'y'を得るために、私は[' toarray() '](https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.spmatrix.toarray)を使って明示的にそれをスパースから密なフォームに変換しました。 html#scipy.sparse.spmatrix.toarray)。だから私は混乱している。 – joelslft

+0

あなたはまだnumpyタイプを使用しています。 'toarray()'はそれをネイティブのpythonリストに変換しないので、なぜ '.nbytes'にアクセスできるのでしょうか?それがネイティブのPythonリストに変換されるまでは、スペースを節約するためにできるだけ疎な表現を使用している可能性があります。 – Soviut