2016-10-08 16 views
0

scipyスパース行列を構築する最善の方法の1つは、coo_matrixメソッドです。大きなscipyスパース行列を作成する

coo_matrix((data, (i, j)), [shape=(M, N)]) 

where: 
data[:] are the entries of the matrix, in any order 
i[:] are the row indices of the matrix entries 
j[:] are the column indices of the matrix entries 

しかし、行列が非常に大きい場合、i、jおよびデータベクトル全体をメモリにロードすることは現実的ではありません。

(data、(i、j))がディスクから(イテレータまたはジェネレータを使って)供給され、ディスク上の配列/ベクトルオブジェクトが.npyまたはpickleの形式であるようなcoo_matrixを構築するにはどうすればよいですか?

pickpyは、numpy.save/loadがscipy sparseに最適化されていないため、より良いオプションです。もっと速いフォーマットがあるかもしれません。

numpy.genfromtext()とnumpy.loadtxt()は両方とも扱いにくく、遅く、メモリが不足しています。

答えて

0

私はよく分かりません。 i, j, data配列が大きすぎてメモリに作成またはロードできない場合は、大きすぎて疎行列を作成できません。

これらの3つの配列が有効な場合、結果のスパース行列は、対処または変更なしで対応する属性として使用されます。 indptr配列は1行につき1つの値を持つため、cooから構成されたcsr行列は少しコンパクトかもしれません。 dataindicesの配列は、cooと同じサイズになります(複製または並べ替えが与えられています)。

dokおよびlilの形式をインクリメンタルマトリックス作成に使用できますが、長期的にメモリを節約することはできません。どちらの場合でも、非ゼロデータポイントごとにエントリが必要です。 lilの場合は、たくさんのリストがあります。 dokは実際の辞書です。

スパースフォーマットのいずれも「仮想」ではなく、必要に応じて「オンザフライ」で要素を作成します。

3つの定義された配列をロードするさまざまな方法が、その合計サイズが大きすぎるとどのように役立つのか分かりません。

In [782]: data=np.ones((10,),int) 
In [783]: rows=np.arange(10) 
In [784]: cols=np.arange(10) 
In [785]: M=sparse.coo_matrix((data,(rows,cols))) 
In [786]: M.data 
Out[786]: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) 
In [787]: M.data is data 
Out[787]: True 
In [789]: M.col is cols 
Out[789]: True 

基本的に、cooフォーマットは、これらの3つのアレイを格納する方法です。実際の仕事、すべての数学、合計、さらにはインデックス作成は、csr形式で実行されます。

+0

例を使用してcoo_matrixを作成すると、メモリにオブジェクトデータ、行、colsおよびMが含まれます。問題は、ストリーミング行、列およびデータを使用してインクリメンタルにcoo_matrixを作成できるかどうかです。あなたの答えはそれが不可能であることを示唆しています。 –

+0

'coo_matrix'の' __init__'コードはPythonで書かれており、簡単に従うことができます。ブロックから 'coo'マトリックスを構築する' bmat'のコードもまた参考になります。 – hpaulj

関連する問題