29

SciPy Sparse Matrix チュートリアルは非常に優れていますが、実際には未開発のスライスに関するセクションが残されています (まだアウトライン形式です。セクション:「疎行列の処理」を参照してください)。

この質問に答えたら、チュートリアルを更新しようとします。

私は大きな疎行列を持っています - 現在 dok_matrix 形式です。

import numpy as np
from scipy import sparse
M = sparse.dok_matrix((10**6, 10**6))

さまざまな方法で列をスライスできるようにしたいのですが、他の方法では行をスライスしたいと思っています。bool_vect理想的には、次のように、スパース行列をスライスする高度なインデックス作成 (つまり、ブール ベクトル) を使用しますM

bool_vect = np.arange(10**6)%2  # every even index
out = M[bool_vect,:]            # Want to select every even row

また

out = M[:,bool_vect] # Want to select every even column

まず、dok_matrices はこれをサポートしていませんが、最初に lil_matrices にキャストすると (ゆっくりと) 動作すると思います。sparse.lil_matrix(M)

チュートリアルから収集できる限り-列をスライスするにはCSCを使用し、行をスライスするにはCSRをスライスします。つまり、次の方法でマトリックスMをキャストする必要があります。

M.tocsc()[:,bool_vect]

また

M.tocsr()[bool_vect,:]

私はここでちょっと推測していますが、それが原因でコードが遅くなります。これがどのように機能するかを理解している人からの助けをいただければ幸いです。前もって感謝します。

マトリックスにブール配列ではなく、整数 (インデックス) のリストをインデックス付けする必要があることが判明した場合は、それも喜んで見つけてください。どちらかが効率的です。

最後に、これは大きなマトリックスなので、これがその場で/ブロードキャストで発生する場合はボーナスポイントです.

4

1 に答える 1

49

わかりましたので、これを行う「正しい」方法は次のとおりだと確信しています。列をスライスする場合は、 tocsc() を使用し、整数のリスト/配列を使用してスライスします。ブール値ベクトルは、スパース行列ではうまくいかないようです-numpyのndarrayで行う方法です。つまり、答えは。

indices = np.where(bool_vect)[0]
out1 = M.tocsc()[:,indices]
out2 = M.tocsr()[indices,:]

しかし、質問: これが最善の方法ですか? これは整っていますか?

実際には、これはその場で起こっているようです-そして、以前の試み(lil_matrixを使用)よりもはるかに高速です。

于 2012-11-12T22:22:14.660 に答える