如何使用 NetworkX 和 Matplotlib

103 阅读2分钟

使用 NetworkX 的 neighbors 方法来检测和消除路径长度仅为 2 的树。该方法可以获取给定节点的所有邻居节点。如果一个节点的邻居节点为空,则该节点是路径长度为 2 的树的一部分,可以将其从图中移除。

image.png

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()

f = open("test_data.csv", "r")

for line in f:
    node1, node2, weight1 = line.split(",")
    G.add_edge(node1, node2)

for src, trg in G.edges():
    if G.neighbors(trg) == []:
        G.remove_edge(*(src,trg)) # Need the * to unpack the edge nodes

nx.draw(G)
plt.show()

方法二:使用 NetworkX 的 bellman_ford 方法

也可以使用 NetworkX 的 bellman_ford 方法来检测和消除路径长度仅为 2 的树。该方法可以找到图中任意两点之间的最短路径。如果两点之间的最短路径长度小于或等于 2,则该路径是路径长度为 2 的树的一部分,可以将其从图中移除。

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()

f = open("test_data.csv", "r")

for node1, node2, weight1 in data:
    G.add_edge(node1, node2, weight=-1)

min_lenght = 2
F = nx.DiGraph() 

for u, v in G.edges():
    vals, distances = nx.bellman_ford(G, u)
    if min(distances.values()) < - min_lenght:
        for u, v in vals.items():
            if v:
                F.add_edge(v, u)

nx.draw(F)
plt.show()

方法三:使用 dict 来存储节点和边的信息

也可以使用 Python 的 dict 来存储节点和边的信息,然后遍历 dict 来检测和消除路径长度仅为 2 的树。

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()

f = open("test_data.csv", "r")

blocs_by_node = {}
for line in f:
    node1, node2, weight1 = line.split(",")
    if node1 not in blocs_by_node and node2 not in blocs_by_node :
        bloc = [node1, node2]
        blocs_by_node[node1] = bloc
        blocs_by_node[node2] = bloc
    elif node1 not in blocs_by_node and node2 in blocs_by_node :
        bloc = blocs_by_node[node2]
        bloc.append(node1)
        blocs_by_node[node1] = bloc
    elif node1 in blocs_by_node and node2 not in blocs_by_node :
        bloc = blocs_by_node[node1]
        bloc.append(node2)
        blocs_by_node[node2] = bloc
    elif blocs_by_node[node1] is not blocs_by_node[node2] :
        bloc = blocs_by_node[node1]
        for node in blocs_by_node[node2] :
            bloc.append(node)
            blocs_by_node[node] = bloc

f.close()

f = open("test_data.csv", "r")

for line in f:
    node1, node2, weight1 = line.split(",")
    if len(blocs_by_node[node1]) > 2 :
        G.add_edge(node1, node2)

f.close()

nx.draw(G)
plt.show()

Espero que esto te ayude!