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)