2017-10-28 5 views
3

を意味する:私は、隣接行列を生成したいは、リストから隣接行列を生成し、隣接関係が、私はこのようなリスト持っ等しい要素

lst = [0, 1, 0, 5, 0, 1] 

out = 
array([[ 1., 0., 1., 0., 1., 0.], 
     [ 0., 1., 0., 0., 0., 1.], 
     [ 1., 0., 1., 0., 1., 0.], 
     [ 0., 0., 0., 1., 0., 0.], 
     [ 1., 0., 1., 0., 1., 0.], 
     [ 0., 1., 0., 0., 0., 1.]]) 

out[i,j] = 1 if lst[i]==lst[j]

をここで私のコードは2つのループ用です:

lst = np.array(lst) 
label_lst = list(set(lst)) 
out = np.eye(lst.size, dtype=np.float32) 
for label in label_lst: 
    idx = np.where(lst == label)[0] 
    for pair in itertools.combinations(idx,2): 
    out[pair[0],pair[1]] = 1 
    out[pair[1],pair[0]] = 1 

しかし、これを改善する方法があるはずです。なにか提案を?

答えて

3

使用broadcasted comparison -

np.equal.outer(lst, lst).astype(int) # or convert to float 

サンプルラン -

In [787]: lst = [0, 1, 0, 5, 0, 1] 

In [788]: np.equal.outer(lst, lst).astype(int) 
Out[788]: 
array([[1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 0, 0, 1], 
     [1, 0, 1, 0, 1, 0], 
     [0, 0, 0, 1, 0, 0], 
     [1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 0, 0, 1]]) 

または配列に変換した後、手動2Dに延び、比較 -

In [793]: a = np.asarray(lst) 

In [794]: (a[:,None]==a).astype(int) 
Out[794]: 
array([[1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 0, 0, 1], 
     [1, 0, 1, 0, 1, 0], 
     [0, 0, 0, 1, 0, 0], 
     [1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 0, 0, 1]]) 
+0

非常にきれいな解決策(+1)のように見えますが、 –

2

@Divakarから提案ものの非常に良いですが、私はこれをnumpyのない解決策としてここに残します。

lst = [0, 1, 0, 5, 0, 1] 
print([[1 if x==y else 0 for x in lst ] for y in lst]) 

また、大きなリストの場合、受け入れられる解決策ははるかに高速です。

関連する問題