0

質問は非常に単純です。scipyスパース行列M(100,000X500,000)から特定の行rがあり、M行列でその位置/インデックスを見つけたいとしましょう。どうすればこれを効率的に達成できますか?

現在、私は次の方法を試していますが、それはひどく遅いです。

offset = 500
begin = 0
end  = begin + offset
row = row.todense() #convert sparse to dense
while 1:
    sub_M = M[begin:end,:].todense() #M matrix is too big that its dense cannot fit memory 
    labels=np.all(row == sub_M, axis=1) # here we find row in the sub set of M, but in a dense representation
    begin = end
    end = end + offset
    if (end - offset) == M.shape[0]:
        break
    elif end > M.shape[0]:
        end = M.shape[0]
4

2 に答える 2

1

1 つ以上のスパース マトリックス タイプの内部を掘り下げたい場合を除き、マトリックスに CSR 形式を使用する必要があります。

  • 各行列行の長さ (L2 ノルム) を計算します。言い換えると:sum(multiply(M, M), 2)
  • r を (L2) 長さ 1 に正規化する
  • 行列乗算M*r(r は列ベクトルとして扱われます)

のエントリがM*r対応する行の長さと一致する場合、一致しています。

のデフォルトは L2 ノルムordであることに注意してください。numpy.linalg.norm

于 2012-12-21T02:41:24.740 に答える
0

最後に、非常にシンプルだが時間効率の高いソリューションを思いつきました。疎行列の各行は文字列に変換され、そのインデックス/場所とともに辞書に入れられます。次に、行を見つける必要があり、辞書のキーであり、 dic[str(row)] はそのインデックスを提供します。

于 2012-12-26T01:19:13.917 に答える