0

我有一个使用 networkx 创建的简单图表。

import networkx as nx
import matplotlib.pyplot as plt
from pprint import pprint

G = nx.Graph()
head_nodes = range(0, 9)
tail_nodes = range(1, 10)
edge_ls = list(zip(head_nodes, tail_nodes))
G.add_nodes_from(range(0, 10))
G.add_edges_from(edge_ls)
pprint(G.nodes())
nx.draw(G)
plt.show()

我想删除节点 0 和 1 之间的边并添加三个新节点(比如节点 10、11、12)。然后,必须在节点 0 和 10、10 和 11、11 和 2 之间创建边。

G.remove_edge(0,1)用来删除节点 0 和 1 之间的边缘。

有人可以建议可以使用哪个功能来添加 n新节点吗?

另外,如果n添加了新节点,这些节点会自动编号吗?

我打算在循环中执行此操作,删除两个节点之间已经存在的边并添加n新节点和连接这些节点的边。

编辑:我尝试了以下方法来添加n新的边缘

G = nx.Graph()
head_nodes = range(0, 9)
tail_nodes = range(1, 10)
edge_ls = list(zip(head_nodes, tail_nodes))
G.add_nodes_from(range(0, 10))
G.add_edges_from(edge_ls)

head = 0
tail = 1
G.remove_edge(head, tail)
Nnodes = G.number_of_nodes()
newnodes = [head, Nnodes+1, Nnodes+2, Nnodes+3, tail] # head and tail already exists
newedges = [(x, y) for x, y in zip(newnodes[0:len(newnodes)-1], newnodes[1:len(newnodes)])]
G.add_edges_from(newedges)
pprint(G.edges())

输出:

EdgeView([(0, 11), (1, 2), (1, 13), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (11, 12), (12, 13)])

Expected Output:
EdgeView([(0, 11), (1, 2), (13, 1), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (11, 12), (12, 13)])

我不确定为什么按 (13,1)(head, tail) 顺序添加的边存储为 (1,13)。关于如何在添加新边的同时保留头尾节点的顺序有什么建议吗?

EDIT2:用 nx.OrderedGraph() 替换 nx.Graph() 也无济于事。

4

1 回答 1

2

AGraph是一个无向图,其中(1, 13)(13, 1)意思相同,边没有“箭头”。

你想要的是一个DiGraph,意思是一个有向图。见https://networkx.github.io/documentation/stable/reference/classes/index.html

AnOrderedGraph是另外一回事 - 它只是意味着当您迭代节点和边时,它们会以特定的顺序出现(类似于列表与集合)。

于 2019-09-14T13:25:13.870 回答