私はcsr_matrix型のスパース行列を持っています。私は新しいcsr_matrix 'b'を作成する操作を実行したいが、 'b'の各行は 'a'の同じi行である。タイル操作で、別のcsr_matrixの1行からcsr_matrixを作成する
通常のnumpy配列では、 'tile'演算を使用することができます。しかし、私はcsr_matrixについて同じものを見つけることができません。行列のサイズは10000 X 10000
私はcsr_matrix型のスパース行列を持っています。私は新しいcsr_matrix 'b'を作成する操作を実行したいが、 'b'の各行は 'a'の同じi行である。タイル操作で、別のcsr_matrixの1行からcsr_matrixを作成する
通常のnumpy配列では、 'tile'演算を使用することができます。しかし、私はcsr_matrixについて同じものを見つけることができません。行列のサイズは10000 X 10000
あるよう
最初のnumpyの行列を作成し、csr_matrixへの変換は、あなたが他のリストから新しいスパース行列を作成することができますblk
形式は、あるオプションではありません行列。
だから、スタートのために、あなたは
a1 = a[I,:]
ll = [a1,a1,a1,a1]
sparse.blk_matrix(ll)
私はこれをテストするために実行するシェルを持っていませんでした。
内部的には、このフォーマットはすべての入力配列をcoo
形式に変換し、coo
属性を3つの大きなリスト(または配列)にまとめます。タイリングされた行の場合、data
とcol
(j)の値は繰り返されます。 row
(I)の値はステップします。
これにアプローチするもう1つの方法は、小さなテストマトリックスを作成し、属性を調べることです。どのような繰り返しが見られますか? coo
形式のパターンを確認するのは簡単です。 lil
は、リスト*n
の操作で多分簡単に複製できます。 csr
は分かりにくいです。
私は実際には完全な数値マトリックスを作成する必要はなく、私の目的にとってはかなり高速です。だから、将来の人々のために有用かどう答えとして、それを追加する:これは「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
は、メモリの全体の多くを取るつもりLLを作成されていません。それは疎なマトリックスを持つという目的を打ち負かすのではないでしょうか? – Naman
また、私は解決策に達する可能性があるので、回答として追加しました。興味があれば見てください。 – Naman
'csr'を直接作成する方がコンパクトになります。なぜなら、' indptr'属性は 'coo'' rows'よりも短いからです。 – hpaulj