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')]}
3 Réponses :
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 >
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')]}
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)) code >
Heureusement que vous en avez parlé, vous ne saviez pas à l'époque, to_pandas_adjacency , a mis à jour le message :) @infiniteloop
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)