tutorial directed python networkx directed-graph

python - directed - networkx draw



Obtención de la raíz(cabecera) de un DiGraph en networkx(Python) (1)

Estoy tratando de usar networkx para hacer una representación gráfica en un proyecto, y no estoy seguro de cómo hacer algunas cosas que deberían ser simples. Creé un gráfico dirigido con un montón de nodos y bordes, de manera que solo hay un elemento raíz en este gráfico. Ahora, lo que me gustaría hacer es comenzar en la raíz y luego recorrer los elementos secundarios de cada elemento y extraer información de ellos. ¿Cómo obtengo el elemento raíz de este DiGraph?

Entonces sería algo así:

#This is NOT real code, just pseudopython to convey the general intent of what I''d like to do root = myDiGraph.root() for child in root.children(): iterateThroughChildren(child) def iterateThroughChildren(parent): if parent.hasNoChildren(): return for child in parent.children(): //do something // iterateThroughChildren(child)

No vi nada en la documentación que sugiriera una forma fácil de recuperar la raíz de un DiGraph. ¿Se supone que debo inferir esto manualmente? : O Intenté obtener iter(myDiGraph) con la esperanza de que fuera iterativo comenzando desde la raíz, pero el orden parece ser aleatorio ...: /

Se agradecerá la ayuda, gracias!


Si al tener "un elemento raíz" quiere decir que su gráfico dirigido es un árbol arraigado , entonces la raíz será el único nodo con cero grados de grado.

Puede encontrar ese nodo en tiempo lineal (en el número de nodos) con:

In [1]: import networkx as nx In [2]: G=nx.balanced_tree(2,3,create_using=nx.DiGraph()) # tree rooted at 0 In [3]: [n for n,d in G.in_degree() if d==0] Out[3]: [0]

O podrías usar una ordenación topológica (la raíz es el primer elemento):

In [4]: nx.topological_sort(G) Out[4]: [0, 1, 3, 8, 7, 4, 9, 10, 2, 5, 11, 12, 6, 13, 14]

Alternativamente, podría ser más rápido comenzar con un nodo dado (aleatorio) y seguir a los predecesores hasta que encuentre un nodo sin predecesores.