1

数十ギガバイトを占める巨大なゴツゴツした行列Aがあるとします。このメモリを割り当てるには、無視できないほどの時間がかかります。

numpy行列と同じ次元のscipyスパース行列のコレクションもあるとしましょう。これらのスパース行列の1つを密行列に変換して、ベクトル化された演算を実行したい場合があります。

スパース行列を密行列に変換するたびにスペースを再割り当てするのではなく、これらのスパース行列の1つをAにロードできますか?scipyスパース行列で使用できる.toarray()メソッドは、オプションの密配列引数をとらないようですが、これを行う他の方法があるかもしれません。

4

2 に答える 2

2

スパース行列がCOO形式の場合:

def assign_coo_to_dense(sparse, dense):
    dense[sparse.row, sparse.col] = sparse.data

CSR形式の場合:

def assign_csr_to_dense(sparse, dense):
    rows = sum((m * [k] for k, m in enumerate(np.diff(sparse.indptr))), [])
    dense[rows, sparse.indices] = sparse.data

安全のために、上記の各関数の先頭に次の行を追加することをお勧めします。

assert sparse.shape == dense.shape
dense[:] = 0
于 2012-02-06T11:49:20.357 に答える
1

これを行うためのより良い方法があるはずです(そして私はドキュメントを精査していません)が、いつでもスパース配列の要素をループしてデンス配列に割り当てることができます(おそらく最初にデンス配列をゼロにする) )。これが遅すぎる場合は、簡単にC拡張機能を記述できるようです。

于 2012-01-28T02:36:55.700 に答える