2016-08-08 16 views
1

未知のサイズのスパース行列を作成するには、私が作成するノード2と5の間の重量1のエッジを示しますこれらのタプルを使用してスパースな隣接行列を作成します。通常、私は疎行列を初期化して、例</p> <pre><code>2 5 1 </code></pre> <p>ため、私はグラフのエッジを示す各ラインのテキストファイルを有する

G = scipy.sparse.lil_matrix((n,n)) 

ここで、nはグラフのノード数です。しかし、この場合、私は何が 'n'であるか分からない。ファイルの行をループして最大ノードインデックスを見つけ出し、lil_matrixを作成してからファイルを繰り返しループするよりも、行列を作成する方が効率的ですか?私の現在の実装では、これです:

n = 0 
with open(gfile) as f: 
    for line in f: 
     temp = map(int,line.split()) 
     n = np.max([n,temp[0],temp[1]]) 
G = sp.lil_matrix((n,n)) 
with open(gfile) as f: 
    for line in f: 
     temp = map(int,line.split()) 
     G[temp[0],temp[1]] = temp[2] 

答えて

2

スパース行列を作成する、元の、さらに原型方法は、row, col, dataアレイ(またはリスト)内の全ての入力を収集し、マトリックスを構築するcoo_matrixを使用することです。形状は、それらの入力(最大インデックス値)から推論することも、パラメータとして与えることもできます。

あなたのコードを適応させるために

row, col, data = [],[],[] 
with open(gfile) as f: 
    for line in f: 
     temp = map(int,line.split()) 
     # G[temp[0],temp[1]] = temp[2] 
     data.append(temp[2]) 
     row.append(temp[0]) 
     col.append(temp[1]) 
G = sparse.coo_matrix((data, (row,col)) 

リスト・アペンドは(lil割り当てがリストにも追加必要)少なくとも早く行は読み通りであり、スパース行列の挿入よりも良い、でもlil

私はあなたにも行うことができ疑う:genfromtxtまたはloadtxtとファイル全体を読み込み、その結果の列からスパース行列を作成している

A = np.genfromtxt(gfile, dtype=int) # default white space delimiter 
# A should now be a 2d 3 column array 
G = sparse.coo_matrix((A[:,2], (A[:,0], A[:,1])) 

(I前MATLAB年にスパース行列を作った場合、私は、ループなしで、有限要素ブロックから、これらのアレイを組み立てるインデクシングの巧妙な使用にかかわらず、このデータのソート、列、行の初期化を使用する。)

+0

おかげ!あなたのloadtxtのコメント:私はこれらのファイルのかなり大きいことができるので、私が避けたかったtxtファイル全体をロードすると思います。 – NSR

+0

新しい 'genfromtxt'は' max_rows'パラメータをとります。また、すべてのバージョンでは、独自のフィルタを使用してラインをフィードできます。いずれにしても、 'genfromtxt'は独自の行を読み込んで解析するよりも速くはありません。それは同じことをしている。 – hpaulj

関連する問題

 関連する問題