2017-04-25 12 views
1

私は疎な行列のPythonの行情報リストを持っています。各行は、(列、値)タプルのリストとして表されます。 alistそれを呼び出す:タプルのリストのリストから疎なlil_matrixを構築する

alist = [[(1,10), (3,-3)], 
     [(2,12)]] 

どのように効率的にこのような行列で、その結果、リストのリストから、scipyのダウンロードスパース行列を構築することができます。明白なアプローチはscipy.sparse.lil_matrixを作ることです

0 10 0 -3 
0 0 2 0 

、どの内部的にこの "リストのリスト"構造を持っています。別のまばらな配列から始まる高密度アレイ

  • から始まる

    • ちょうど空の配列の唯一の方法だから、

    を構築:しかしscipy.sparse.lil_matrix — SciPy v0.19.0 Reference Guideから、私は3つのだけ、それらを構築する方法を参照してください新鮮なデータを得るためには、この問題を他の疎な行列表現で解決するか、密度の高い配列から始めてどちらも最初の問題に対処するかどちらかがより効率的ではないようです0そのデータのために。

    私は空のものを作ることができ、ループを使って値を追加することができますが、確かに何かが欠けています。

    疎な行列の場合、scipyのドキュメントは本当にイライラします。

  • 答えて

    1

    データレイアウトは珍しいものです。ここに私の最初の刺し傷があります。

    In [565]: M = sparse.lil_matrix((2,4), dtype=int) 
    In [566]: M 
    Out[566]: 
    <2x4 sparse matrix of type '<class 'numpy.int32'>' 
        with 0 stored elements in LInked List format> 
    In [567]: for i,row in enumerate(alist): 
        ...:  for col in row: 
        ...:   M[i, col[0]] = col[1] 
        ...:   
    In [568]: M 
    Out[568]: 
    <2x4 sparse matrix of type '<class 'numpy.int32'>' 
        with 3 stored elements in LInked List format> 
    In [569]: M.A 
    Out[569]: 
    array([[ 0, 10, 0, -3], 
         [ 0, 0, 12, 0]]) 
    

    はい、反復です。そのためにはlilが最適です。

    または入力の共通cooスタイルを使用して:つまり

    、で始まる:

    別のオプションが空白 lilマトリックスを作成し、直接その属性を記入することです
    In [580]: data,col,row = [],[],[] 
    In [581]: for i, rr in enumerate(alist): 
        ...:  for cc in rr: 
        ...:   row.append(i) 
        ...:   col.append(cc[0]) 
        ...:   data.append(cc[1]) 
        ...:   
    In [582]: data,col,row 
    Out[582]: ([10, -3, 12], [1, 3, 2], [0, 0, 1]) 
    In [583]: M1=sparse.coo_matrix((data,(row,col)),shape=(2,4)) 
    In [584]: M1 
    Out[584]: 
    <2x4 sparse matrix of type '<class 'numpy.int32'>' 
        with 3 stored elements in COOrdinate format> 
    In [585]: M1.A 
    Out[585]: 
    array([[ 0, 10, 0, -3], 
         [ 0, 0, 12, 0]]) 
    

    In [591]: m.data 
    Out[591]: array([[], []], dtype=object) 
    In [592]: m.rows 
    Out[592]: array([[], []], dtype=object) 
    

    と変更してください。

    In [587]: M.data 
    Out[587]: array([[10, -3], [12]], dtype=object) 
    In [588]: M.rows 
    Out[588]: array([[1, 3], [2]], dtype=object) 
    

    alist構造では2段階の繰り返しが必要です。あなたがcsrindptrを理解することの難しさを述べた別のコメントで

    In [593]: for i, rr in enumerate(alist): 
        ...:  for cc in rr: 
        ...:   m.rows[i].append(cc[0]) 
        ...:   m.data[i].append(cc[1])  
    In [594]: m 
    Out[594]: 
    <2x4 sparse matrix of type '<class 'numpy.int32'>' 
        with 3 stored elements in LInked List format> 
    In [595]: m.A 
    Out[595]: 
    array([[ 0, 10, 0, -3], 
         [ 0, 0, 12, 0]]) 
    

    。これを取得する最も簡単な方法は、次のいずれかの形式を変換することです:

    In [597]: Mr=M.tocsr() 
    In [598]: Mr.indptr 
    Out[598]: array([0, 2, 3], dtype=int32) 
    In [599]: Mr.data 
    Out[599]: array([10, -3, 12]) 
    In [600]: Mr.indices 
    Out[600]: array([1, 3, 2], dtype=int32) 
    
    +0

    このような明確で役立つ詳細な回答 - ありがとうございます!COO形式のコンストラクタは最も自然なようですが、いくつかのジェネレータを用意してメモリと時間効率の良い入力パイプラインを実現することができます。私はscipyの人々が人々がそれらを見つける方法でこれのようないくつかの例を追加することを願っています。これは私のデータが入ってきたフォーマットであり、[Sparse array - Wikipedia](https://en.wikipedia.org/wiki/Sparse_array)で議論されているように、これらの異なるスパースフォーマットをサポートするシステムの数があれば、より多くの人々がそれらを使ってデータを交換すると思う。 – nealmcb

    +1

    私はまず、有限要素問題のためにMATLABで疎行列を扱った。 'coo'形式の入力は唯一のオプションですが、内部的には' csc'(少なくとも '.mat'ファイルに保存される形式)でデータを保存します。疎な数学の大部分は、線形代数問題のために開発されました。 'scipy'はいくつかのフォーマットを追加します(Wiki記事のリンクに注意してください)。現在では、大規模なデータ問題、疎なフィーチャ行列、機械学習、言語学などから、疎な行列の関心が集まっています。 'scikit learn'は、例えばコンパイルされたスパース行列ユーティリティをいくつか追加します。 – hpaulj

    関連する問題