2016-04-14 2 views
1

私はcsr_matrix型のスパース行列を持っています。私は新しいcsr_matrix 'b'を作成する操作を実行したいが、 'b'の各行は 'a'の同じi行である。タイル操作で、別のcsr_matrixの1行からcsr_matrixを作成する

通常のnumpy配列では、 'tile'演算を使用することができます。しかし、私はcsr_matrixについて同じものを見つけることができません。行列のサイズは10000 X 10000

答えて

0

あるよう

最初のnumpyの行列を作成し、csr_matrixへの変換は、あなたが他のリストから新しいスパース行列を作成することができますblk形式は、あるオプションではありません行列。

だから、スタートのために、あなたは

a1 = a[I,:] 
ll = [a1,a1,a1,a1] 
sparse.blk_matrix(ll) 

私はこれをテストするために実行するシェルを持っていませんでした。

内部的には、このフォーマットはすべての入力配列をcoo形式に変換し、coo属性を3つの大きなリスト(または配列)にまとめます。タイリングされた行の場合、datacol(j)の値は繰り返されます。 row(I)の値はステップします。

これにアプローチするもう1つの方法は、小さなテストマトリックスを作成し、属性を調べることです。どのような繰り返しが見られますか? coo形式のパターンを確認するのは簡単です。 lilは、リスト*nの操作で多分簡単に複製できます。 csrは分かりにくいです。

+0

は、メモリの全体の多くを取るつもりLLを作成されていません。それは疎なマトリックスを持つという目的を打ち負かすのではないでしょうか? – Naman

+0

また、私は解決策に達する可能性があるので、回答として追加しました。興味があれば見てください。 – Naman

+1

'csr'を直接作成する方がコンパクトになります。なぜなら、' indptr'属性は 'coo'' rows'よりも短いからです。 – hpaulj

0

私は実際には完全な数値マトリックスを作成する必要はなく、私の目的にとってはかなり高速です。だから、将来の人々のために有用かどう答えとして、それを追加する:これは「A」の第二行を取り、「b」を作成するためにタイル

rows, cols = a.shape 
b = scipy.sparse.csr_matrix((np.tile(a[2].data, rows), np.tile(a[2].indices, rows), 
          np.arange(0, rows*a[2].nnz + 1, a[2].nnz)), shape=a.shape) 

。続き

は、タイミングテストです10000x10000行列のために非常に高速思わ:

100 loops, best of 3: 2.24 ms per loop 
+1

あなたの 'data'と' indices'タイリングは私が 'coo'のために提案したものですが、あなたの' indptr'は 'coo'が必要とするよりも短いです。 'coo'行に相当するものは' np.arange(...)。repeat(nnz) '、' [0,0..0,1,1 ...、2,2 ...] 'のようなものを使います。 。 – hpaulj

+0

真実です、私はあなたの解答を早く誤解しました。 – Naman