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,:]
私はここでちょっと推測していますが、それが原因でコードが遅くなります。これがどのように機能するかを理解している人からの助けをいただければ幸いです。前もって感謝します。
マトリックスにブール配列ではなく、整数 (インデックス) のリストをインデックス付けする必要があることが判明した場合は、それも喜んで見つけてください。どちらかが効率的です。
最後に、これは大きなマトリックスなので、これがその場で/ブロードキャストで発生する場合はボーナスポイントです.