4
votes

Liste adjacente aux pandas de la matrice

J'essaie de découvrir un exemple de construction d'une matrice de contiguïté à partir d'une liste, mais je n'arrive déjà pas à le comprendre. Je pense en termes de .loc () mais je ne sais pas comment indexer correctement.

   A  B  C  D  E
A  0  1  0  1  0
B  0  0  1  0  1
C  0  0  0  1  0
D  0  0  0  0  1
E  1  1  1  0  0

J'ai commencé à construire la matrice avec:

n = len(graph['nodes'])
adj_matr = pd.DataFrame(0, columns = graph['nodes'], index = graph['edges'])

mais maintenant je ne sais pas comment le remplir. Je pense qu'il y a une ligne simple, peut-être avec une compréhension de liste?

Résultat attendu:

{'nodes':['A', 'B', 'C', 'D', 'E'],
 'edges':[('A', 'B'), ('A', 'D'), ('B', 'C'), ('B', 'E'), ('C', 'D'), 
                      ('D', 'E'), ('E', 'A'),('E', 'B'), ('E', 'C')]}


0 commentaires

3 Réponses :


1
votes

pour le graphique non orienté

graph = {'nodes': ['A', 'B', 'C', 'D', 'E'],
         'edges': [('A', 'B'), ('A', 'D'), ('B', 'C'), ('B', 'E'), ('C', 'D'),
                   ('D', 'E'), ('E', 'A'), ('E', 'B'), ('E', 'C')]}
n = len(graph['nodes'])
adj_matr = pd.DataFrame(0, columns=graph['nodes'], index=graph['nodes'])
print(adj_matr)
for i in graph['edges']:
    adj_matr.at[i[0], i[1]] = 1
    # adj_matr.at[i[1], i[0]] = 1

print(adj_matr)

   A  B  C  D  E
A  0  1  0  1  0
B  0  0  1  0  1
C  0  0  0  1  0
D  0  0  0  0  1
E  1  1  1  0  0

pour le graphique dirigé:

graph = {'nodes': ['A', 'B', 'C', 'D', 'E'],
         'edges': [('A', 'B'), ('A', 'D'), ('B', 'C'), ('B', 'E'), ('C', 'D'),
                   ('D', 'E'), ('E', 'A'), ('E', 'B'), ('E', 'C')]}
n = len(graph['nodes'])
adj_matr = pd.DataFrame(0, columns=graph['nodes'], index=graph['nodes'])
for i in graph['edges']:
    adj_matr.at[i[0], i[1]] = 1
    adj_matr.at[i[1], i[0]] = 1


print(adj_matr)

   A  B  C  D  E
A  0  1  0  1  1
B  1  0  1  0  1
C  0  1  0  1  1
D  1  0  1  0  1
E  1  1  1  1  0

p >


0 commentaires

3
votes

Un moyen simple d'obtenir la matrice de contiguïté consiste à utiliser NetworkX

nx.to_pandas_adjacency(g)

    A    B    C    D    E
A  0.0  1.0  0.0  1.0  0.0
B  0.0  0.0  1.0  0.0  1.0
C  0.0  0.0  0.0  1.0  0.0
D  0.0  0.0  0.0  0.0  1.0
E  1.0  1.0  1.0  0.0  0.0
​

Il semble qu'à partir de votre matrice de contiguïté le graphe est dirigé. Vous pouvez créer un graphe orienté comme indiqué ci-dessous et définir ses nœuds et ses arêtes à partir du dictionnaire avec:

import networkx as nx
g = nx.DiGraph()
g.add_nodes_from(d['nodes'])
g.add_edges_from(d['edges'])

Et puis vous pouvez obtenir la matrice de contiguïté en tant que dataframe avec nx.to_pandas_adjacency :

d = {'nodes':['A', 'B', 'C', 'D', 'E'],
     'edges':[('A', 'B'), ('A', 'D'), ('B', 'C'), ('B', 'E'), ('C', 'D'), 
                      ('D', 'E'), ('E', 'A'),('E', 'B'), ('E', 'C')]}


2 commentaires

Cela fonctionne - mais n'oubliez pas de spécifier également l'index lors de la construction du DataFrame pd.DataFrame (m.todense (), columns = nx.nodes (g), index = nx.nodes (g))


Heureusement que vous en avez parlé, vous ne saviez pas à l'époque, to_pandas_adjacency , a mis à jour le message :) @infiniteloop



0
votes

Pour un graphe orienté, vous pouvez utiliser:

df = pd.DataFrame(graph['edges'], columns=['From', 'To'])
df['Edge'] = 1
adj = df.pivot(index='From', columns='To', values='Edge').fillna(0)


0 commentaires