Python 获取包含中间所有节点的networkx子图
我有一个networkx有向图,我想通过传入一个节点列表从中提取一个子图。但是,子图可以包含可能位于我传递的节点之间的所有节点。我选中了Python 获取包含中间所有节点的networkx子图,python,graph,networkx,graph-theory,Python,Graph,Networkx,Graph Theory,我有一个networkx有向图,我想通过传入一个节点列表从中提取一个子图。但是,子图可以包含可能位于我传递的节点之间的所有节点。我选中了nx.subgraph(),但它的工作方式与我的预期不同。举个小例子: import networkx as nx G = nx.DiGraph() edges = [(7, 4), (3, 8), (3, 2), (3, 0), (3, 1), (7, 5), (7, 6), (7, 8)] G.add_edges_from(edges) H = get_s
nx.subgraph()
,但它的工作方式与我的预期不同。举个小例子:
import networkx as nx
G = nx.DiGraph()
edges = [(7, 4), (3, 8), (3, 2), (3, 0), (3, 1), (7, 5), (7, 6), (7, 8)]
G.add_edges_from(edges)
H = get_subgraph(G, [0,6,7,8])
如何编写函数get_subgraph()
,使H具有边[(3,8)、(3,0)、(7,6)、(7,8)]
?
我需要的子图包含我在get\u subgraph()
函数中传递的节点之间的输出路径和传入路径中的所有节点。
一种方法是找到指定节点集之间的最长路径长度,然后找到包含路径中所有节点的相应诱导子图。然而,作为一个有向图,在所说的节点
3
和7
之间将没有直接路径。所以我们需要在图的无向副本中找到路径。让我们设置问题:
G = nx.DiGraph()
edges = [(7, 4), (3, 8), (3, 2), (3, 0), (3, 1), (7, 5), (7, 6), (7, 8)]
G.add_edges_from(edges)
plt.figure(figsize=(10,6))
pos = nx.spring_layout(G, scale=20, k=3/np.sqrt(G.order()))
nx.draw(G, pos, node_color='lightblue',
with_labels=True,
node_size=1500,
arrowsize=20)
现在,我们可以获取图形的无向副本,并查找指定节点的所有副本:
from itertools import combinations
H = nx.to_undirected(G)
nodelist = [0,6,7,8]
paths = {}
for nodes in combinations(nodelist, r=2):
paths[nodes] = nx.shortest_path_length(H, *nodes)
print(paths)
# {(0, 6): 4, (0, 7): 3, (0, 8): 2, (6, 7): 1, (6, 8): 2, (7, 8): 1}
我们可以用以下公式在无向图中找到最长路径:
max_path = max(paths.items(), key=lambda x: x[1])[0]
longest_induced_path = nx.shortest_path(H, *max_path)
相应的诱导子图可通过以下方式获得:
我从以下问题中理解: 您需要一条路径中的所有节点,但需要提供该路径的一些节点,算法应该提供该路径的所有节点,然后您可以将这些节点传递给一个图并生成一个新的图。 它应该是你想要的: 1.必须使用此方法迭代所有节点对:
from itertools import combinations
b= combinations('ABCD', 2)
print(list(b)) --> [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]
理解。谢谢你的意见。这与雅图的答案相似
from itertools import combinations
b= combinations('ABCD', 2)
print(list(b)) --> [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]