2017-09-19 4 views
1

私はスパースlil_matrix形式を使用して2種類の関係のグラフを格納しています。これは私がやっていることです:lil_matrixを使用した複数の関係グラフの分割

e=15 
k= 2 
X = [lil_matrix((e,e)) for i in range(k)] 
#storing type 0 relation# 
X[0][0,14] =1 
X[0][0,8] =1 
X[0][0,9] =1 
X[0][0,10] =1 
X[0][1,14] =1 
X[0][1,6] =1 
X[0][1,7] =1 
X[0][2,8] =1 
X[0][2,9] =1 
X[0][2,10] =1 
X[0][2,12] =1 
X[0][3,6] =1 
X[0][3,12] =1 
X[0][3,11] =1 
X[0][3,13] =1 
X[0][4,11] =1 
X[0][4,13] =1 
X[0][5,13] =1 
X[0][5,11] =1 
X[0][5,10] =1 
X[0][5,12] =1 
#storing type 1 relation# 
X[1][14,7] =1 
X[1][14,6] =1 
X[1][6,7] =1 
X[1][6,8] =1 
X[1][6,9] =1 
X[1][10,9] =1 
X[1][10,8] =1 
X[1][10,11] =1 
X[1][12,8] =1 
X[1][12,10] =1 
X[1][12,11] =1 
X[1][12,13] =1 
X[1][14,12] =1 
X[1][11,9] =1 
X[1][8,7] =1 
X[1][8,9] =1 

私はノードの50%だけを含むネットワークを剪定したいと思います。私が近づいている方法:

nodes_list = range(e) 
total_nodes = len(nodes_list) 
get_percentage_of_prune_nodes = np.int(total_nodes * 0.5) 
new_nodes = sorted(random.sample(nodes_list,get_percentage_of_prune_nodes)) 
e_new= get_percentage_of_prune_nodes 
k_new= 2 
#Y is the pruned matrix# 
Y = [lil_matrix((e_new,e_new)) for i in range(k_new)]  
for i in xrange(e): 
    for j in xrange(e): 
     for rel in xrange(k_new): 
      if i in new_nodes and j in new_nodes: 
       if X[rel][i,j]==1: 
        Y[rel][new_nodes.index(i),new_nodes.index(j)] = 1 

オリジナルの行列(X)が巨大な場合、これはあまり効率的ではありません。これを剪定する最速または賢明な方法はありますか?

+0

クイックリードでは、プルーニングが何をしているのかを視覚化するのは難しいです。しかし、私はこれを改善する2つの方法を想像することができます。 1)密な配列と配列全体の操作でこれを行う方法を理解する。 2)オーバーヘッドの少ない構造を探索する。たとえば、 'dok'マトリックスや'(i、j) 'タプルキーを持つ普通の辞書ですらあります。特別な疎なマトリックス機能は使用していません。 – hpaulj

答えて

1

だけマトリックス上に焦点を当て:

In [318]: X=X[0].astype(int) 
In [327]: X.A 
Out[327]: 
array([[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1], 
     [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1], 
     [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0], 
     [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]) 

In [331]: new_nodes=sorted(random.sample(np.arange(e).tolist(),7)) 
In [332]: new_nodes 
Out[332]: [0, 1, 2, 5, 8, 12, 13] 

In [333]: Y=sparse.lil_matrix((7,7),dtype=int) 
In [334]: for i in range(15): 
    ...:  for j in range(e): 
    ...:   if i in new_nodes and j in new_nodes: 
    ...:    if X[i,j]: 
    ...:     Y[new_nodes.index(i),new_nodes.index(j)]=1 
    ...:     
In [335]: Y 
Out[335]: 
<7x7 sparse matrix of type '<class 'numpy.int32'>' 
    with 5 stored elements in LInked List format> 
In [336]: Y.A 
Out[336]: 
array([[0, 0, 0, 0, 1, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 1, 1, 0], 
     [0, 0, 0, 0, 0, 1, 1], 
     [0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0]]) 

これはnew_nodesで行と列を選択するのと同じである。

In [337]: X[np.ix_(new_nodes,new_nodes)] 
Out[337]: 
<7x7 sparse matrix of type '<class 'numpy.int32'>' 
    with 5 stored elements in LInked List format> 
In [338]: _.A 
Out[338]: 
array([[0, 0, 0, 0, 1, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 1, 1, 0], 
     [0, 0, 0, 0, 0, 1, 1], 
     [0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0]]) 

この割り出しが速く稠密アレイとなる。

In [341]: timeit X[np.ix_(new_nodes,new_nodes)] 
188 µs ± 1.3 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) 
In [342]: timeit X[np.ix_(new_nodes,new_nodes)].A 
222 µs ± 6.77 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 
In [343]: timeit X.A[np.ix_(new_nodes,new_nodes)] 
62 µs ± 654 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) 

高密度アレイアプローチは、メモリエラーに遭遇する可能性があります。しかし、まばらな索引付けにはメモリーの問題もあります。

Sparse matrix slicing memory error

+0

それは私が欲しかったものです。あなたはとてもうまく説明しました。計算速度も向上します。私は答えを受け入れる。 –

関連する問題