从一个有向图上,给出两个顶点(v,u),我需要找到:共同的“外”邻居和共同的“内”邻居。
例如:
import networkx as nx
ghybrid = nx.DiGraph()
ghybrid.add_edge("A", "B")
ghybrid.add_edge("A", "C")
ghybrid.add_edge("B", "D")
ghybrid.add_edge("D", "C")
ghybrid.add_edge("E", "A")
ghybrid.add_edge("E", "D")
Run Code Online (Sandbox Code Playgroud)

我要这个:
# Common out Neighbors
B , E : set(['D'])
E , B : set(['D'])
A , D : set(['C'])
D , A : set(['C'])
# Common in Neighbors
A , D : set(['E'])
D , A : set(['E'])
Run Code Online (Sandbox Code Playgroud)
我可以有共同的“外出”邻居:
def common_out_neighbors(g, i, j):
return set(g.neighbors(i)).intersection(g.neighbors(j))
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何获得通用的“ Neigbors”。谁能帮我?
对于DiGraphs,可以使用predecessors和successors方法:
import networkx as nx
def common_out_neighbors(g, i, j):
return set(g.successors(i)).intersection(g.successors(j))
def common_in_neighbors(g, i, j):
return set(g.predecessors(i)).intersection(g.predecessors(j))
if __name__ == '__main__':
ghybrid = nx.DiGraph()
ghybrid.add_edge("A", "B")
ghybrid.add_edge("A", "C")
ghybrid.add_edge("B", "D")
ghybrid.add_edge("D", "C")
ghybrid.add_edge("E", "A")
ghybrid.add_edge("E", "D")
print common_out_neighbors(ghybrid, 'A', 'D')
print common_in_neighbors(ghybrid, 'A', 'D')
# output
# set(['C'])
# set(['E'])
Run Code Online (Sandbox Code Playgroud)