这些天我正在研究networkx graph。 假设我有这张图。蓝色节点为优先级 1,黄色节点为优先级 2,紫色节点为优先级 3,绿色节点为优先级 4。
我想按优先级进行过滤。例如第一个优先级1,它应该过滤蓝色的节点。我想保留蓝色节点(优先级 1)并忽略其余节点,它应该如下所示。
对于优先级 2,包括优先级节点,它应该显示黄色节点。保留优先级 1(蓝色)和优先级 2(黄色)。这里我应该保留从 10 到 190 的路径,因为有一条来自被忽略节点的路径。它应该看起来像这样。
对于优先级 3 和 4 也是如此。例如,对于优先级 3,我希望将优先级 1、2 和 3 保留在一起,正如我在优先级 2 中所示的那样。
这就是我开始的方式。
collector = nx.DiGraph()
for n1, atrr1 in g1.nodes(data ='True'):
for n2, atrr2 in g1.nodes(data ='True'):
if ((g1.node[n1]['priority'] ==1) & (g1.node[n2]['priority'] ==2)):
if (has_path(g1,n1, n2)):
collector.add_edge(n1,n2)
if ((g1.node[n2]['priority'] ==2) & (g1.node[n1]['priority'] ==2)):
if (has_path(g1,n1, n2)):
collector.add_edge(n1,n2)
nx.draw(collector, with_labels = True, pos = nx.spring_layout(collector))
plt.rcParams["figure.figsize"] = [6,6]
plt.axis('off')
plt.show()
谁能帮我用 python 做到这一点?
最佳答案
一种方法是计算图可达性矩阵(在 a
行、b
列中具有 1
的方阵如果节点 b
可以通过图边从节点 a
到达)。您可以找到如何实现此 here 。
然后,您所要做的就是过滤掉所需的节点,并使用计算矩阵重新绘制过滤后的节点的边(通过仅遍历与新图中出现的节点相对应的行和列,并绘制一个有 1
的边缘)。
关于python - 如何使用networkx图过滤具有特定属性的节点并保留路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58805640/