私は以下のコードを実行すると:なぜ私のコンピュータのメモリよりも(明らかに)大きめの配列を作ることができますか?
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。
'x'は疎行列型なので、上記のことが当てはまります。しかし、 'y'を得るために、私は[' toarray() '](https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.spmatrix.toarray)を使って明示的にそれをスパースから密なフォームに変換しました。 html#scipy.sparse.spmatrix.toarray)。だから私は混乱している。 – joelslft
あなたはまだnumpyタイプを使用しています。 'toarray()'はそれをネイティブのpythonリストに変換しないので、なぜ '.nbytes'にアクセスできるのでしょうか?それがネイティブのPythonリストに変換されるまでは、スペースを節約するためにできるだけ疎な表現を使用している可能性があります。 – Soviut