Как сформировать триплет из связанных компонентов для формирования неориентированного графа? - PullRequest
0 голосов
/ 20 мая 2019

Я хочу создать неориентированный граф размером 3 из заданного набора данных (файл .tsv).Я сделал это в R, но я не могу сделать это на Python, и мой гид настаивал на том, чтобы сделать это на Python, так как это более популярный язык.Небольшая помощь будет высоко оценена.

Пытался использовать этот код, который я нашел здесь в stackoverflow, но не работал вообще.Код:

    import networkx as nx
    import pandas as pd
    from itertools import chain

    adj_matrix = [
    [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, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
    [0, 0, 1, 0, 0, 1, 0, 0, 0, 0],
    [0, 0, 0, 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],
    ]

    df = pd.DataFrame(adj_matrix)

    G = nx.from_pandas_adjacency(df)

    # filter components of size 3
    triplets = [c for c in nx.connected_components(G) if len(c) == 3]

Мой код до сих пор

    a_col=length(adj[1,])
    a_row=length(adj[,1])

    trip=NULL  #NULL matrix to store triplet values

    for(i in 1:a_row)
    {
      for(j in 1:a_col)
      {
        if(adj[i,j]==1)
        {
          for(k in (j+1):a_col)
          {
            if(adj[i,k]==1)
           {
            cat("\nTriplets: ",i,j,k)
            trip<-rbind(trip,c(i,j,k))
           }
        }  
        for(l in (i+1):a_row)
        {
          if(adj[l,j]==1)
          {
           cat("\nTriplets: ",i,j,l)
           trip<-rbind(trip,c(i,j,l))
          }
         }
       }
     }
    }

Набор данных, который я использовал:

0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0
0   0   0   0   1   0   0   1   0   0
0   0   0   0   0   0   0   0   1   1
0   0   1   0   0   1   0   0   1   0
0   0   0   0   1   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0
0   0   1   0   0   0   0   0   0   0
0   0   0   1   1   0   0   0   0   0
0   0   0   1   0   0   0   0   0   0

Ожидаемые триплеты:

3   5   8
3   5   6
3   5   9
4   9   10
4   9   5 

1 Ответ

0 голосов
/ 20 мая 2019
import networkx as nx
import pandas as pd

# 1. Transform your data to python list of lists:
data = [
    [0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,1,0,0,1,0,0],
    [0,0,0,0,0,0,0,0,1,1],
    [0,0,1,0,0,1,0,0,1,0],
    [0,0,0,0,1,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0],
    [0,0,1,0,0,0,0,0,0,0],
    [0,0,0,1,1,0,0,0,0,0],
    [0,0,0,1,0,0,0,0,0,0]
]

# 2. Create Pandas dataframe from the data
df = pd.DataFrame(data)

# 3. Create graph from the adjacency matrix
G = nx.from_pandas_adjacency(df)

# 4. Print all connected components
for c in nx.connected_components(G):
    print(c)

# END

напечатает:

{0}
{1}
{2, 3, 4, 5, 7, 8, 9}
{6}

Давайте нарисуем этот график:

nx.draw(G)

enter image description here

Вот как вы можете обрабатывать графики с помощью networkx. В вашем графике нет связанных компонентов с длиной = 3 и нет сортировок, поэтому я не знаю, что вы ожидаете получить. Но если вы хотите найти различные типы треугольников, вы можете запустить эту функцию:

nx.triangles(G)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...