2012-03-24 9 views
5

この質問は2つの部分(多分一つの解決策?)があります。疎行列から簡単に疎行列からのベクトルのサンプリング、およびサンプルから新しいマトリックスを作成する(パイソン)

サンプルベクトルを:ありスパース行列からベクトルを簡単にサンプリングする方法は? random.sampleを使って行をサンプルしようとすると、TypeErrorが発生します。疎な行列の長さはあいまいです。

indxSampls = sample(range(sm.shape[0]), k) 
sampledRows = [] 
for i in indxSampls: 
    sampledRows+=[sm.getrow(i)] 

その他の効率的な/エレガントなアイデア:

from random import sample 
import numpy as np 
from scipy.sparse import lil_matrix 
K = 2 
m = [[1,2],[0,4],[5,0],[0,8]] 
sample(m,K) #works OK 
mm = np.array(m) 
sample(m,K) #works OK 
sm = lil_matrix(m) 
sample(sm,K) #throws exception TypeError: sparse matrix length is ambiguous. 

私の現在のソリューションは,,のようなものを、その後、行列の行数からサンプル)(GetRowを使用するのですか?高密度マトリクスサイズは1000×30000であり、より大きい可能性がある。スパースベクトルのリストからスパース行列を構築

:今、私は、その後、それを高密度化するリストのリストに変換し、convetなしスパース行列に変換することができますどのように、私は、サンプリングベクトルsampledRowsのリストを持っている想像それはlil_matrixに?

答えて

3

これは(random.sampleによって決まるために)行のちょうどKとLIL形式の行列をあなたを取得します

sm[np.random.sample(sm.shape[0], K, replace=False), :] 

を試してみてください。私はそれが超高速であるかどうかはわかりませんが、あなたが現在やっているように行ごとに手動でアクセスするよりも悪いことはありません。

+0

スパース(スパースではない)ベクトルではなく、さまざまな長さのリストを返すので、実際には機能しません。例えば([[1,2]、[8]]、dtype = object) – ScienceFriction

+0

@ScienceFrictionおっと、そうです。すべての行にエントリがあるサンプルをテストします。私は答えを1つのステップで実際にあなたを疎な行列にする類似のものに変更しました。 – Dougal

+0

ありがとう!魅力のように働く。 – ScienceFriction

関連する問題