Estoy tratando de obtener los nodos vecinos de un nodo terminal en Networkx

import networkx as nx

tail = [1,2,3]
head = [2,3,4]
ed_ls = [(t, h) for t, h in zip(tail, head)]
G = nx.OrderedDiGraph()
G.add_edges_from(ed_ls)

print(G[4])
print(G.in_edges(nbunch=[4]))

No estoy seguro de por qué se devuelve un dict vacío.

¿Alguna sugerencia?

1
Natasha 30 ago. 2020 a las 18:56

1 respuesta

La mejor respuesta

G[4] devuelve un diccionario vacío ya que no hay borde saliente del nodo. Considerando que, G.in_edges(nbunch=[4]) devuelve (3, 4) que es el borde que contiene el nodo 4.

Si lo he entendido correctamente, ¿desea específicamente acceder a los vecinos de un nodo terminal? Ahora, en ese caso, los vecinos del nodo terminal son simplemente los predecesores del nodo (ya que no hay sucesores del nodo), simplemente puede probar la función Digraph.predecessors:

print(list(G.predecessors(4)))
# Output : [3]

Considere otro ejemplo con más aristas:

import networkx as nx

tail = [1, 2, 3, 4, 2, 3]
head = [2, 3, 4, 5, 5, 5]
ed_ls = [(t, h) for t, h in zip(tail, head)]
G = nx.OrderedDiGraph()
G.add_edges_from(ed_ls)

print(list(G.predecessors(5)))
# Output: [4, 2, 3]

Actualizar

La razón por la que incluso G.neighbors[4] devuelve un resultado vacío es porque en el caso de DiGraphs, DiGraph.neighbors y DiGraph.successors son iguales. Puede ver el código fuente aquí . Como no hay sucesor para un nodo terminal, obtenemos una lista vacía.

0
Gambit1614 31 ago. 2020 a las 06:28