保留边的顺序以将边权重添加到 Networkx 图
Preserving order of edges for adding edge weights to a Networkx graph
我有以下图表,
ed_ls = [(0, 1), (0, 63), (1, 2), (1, 3), (54, 0)]
ed_w = [1, 2, 3, 4, 5]
G = nx.Graph()
G.add_edges_from(ed_ls)
edge_w = OrderedDict(zip(G.edges, ed_w))
nx.set_edge_attributes(G, edge_w, 'weight')
print(G.edges)
print(nx.get_edge_attributes(G, 'weight'))
获得的输出:
{(0, 1): 1, (0, 63): 2, (0, 54): 3, (1, 2): 4, (1, 3): 5}
ed_w
中的边权重与 ed_ls
中的边顺序相同。由于边的顺序
未保留,分配了错误的边权重。我可以使用 nx.DiGraph
来避免这个问题。但是,我想稍后使用 nx.k_core
,这不适用于有向图。关于的建议
如何继续将受到高度赞赏。
为什么不在将边添加到图中时将权重分配给边?
ed_ls = [(0, 1), (0, 63), (1, 2), (1, 3), (54, 0)]
ed_w = [1, 2, 3, 4, 5]
G = nx.Graph()
for i in range(len(ed_ls)):
src, dst = ed_ls[i]
G.add_edge(src, dst, weight=ed_w[i])
您可以使用 Graph.add_weighted_edges_from
来简化此操作:
ed_ls = [(0, 1), (0, 63), (1, 2), (1, 3), (54, 0)]
ed_w = [1, 2, 3, 4, 5]
G = nx.Graph()
G.add_weighted_edges_from(((*edge, w) for edge, w in zip(ed_ls, ed_w)))
G.edges(data=True)
EdgeDataView([(0, 1, {'weight': 1}), (0, 63, {'weight': 2}),
(0, 54, {'weight': 5}), (1, 2, {'weight': 3}),
(1, 3, {'weight': 4})])
如果您使用的是 3.7 以上的 python 版本,字典会保持插入顺序,但您在打印 G.edges(data=True)
时看到的顺序不一定是边添加的顺序,而是同意节点添加。如您在此示例中所见,(54, 0)
显示在前面
(1, 2)
因为之前添加了节点 0
。
我有以下图表,
ed_ls = [(0, 1), (0, 63), (1, 2), (1, 3), (54, 0)]
ed_w = [1, 2, 3, 4, 5]
G = nx.Graph()
G.add_edges_from(ed_ls)
edge_w = OrderedDict(zip(G.edges, ed_w))
nx.set_edge_attributes(G, edge_w, 'weight')
print(G.edges)
print(nx.get_edge_attributes(G, 'weight'))
获得的输出:
{(0, 1): 1, (0, 63): 2, (0, 54): 3, (1, 2): 4, (1, 3): 5}
ed_w
中的边权重与 ed_ls
中的边顺序相同。由于边的顺序
未保留,分配了错误的边权重。我可以使用 nx.DiGraph
来避免这个问题。但是,我想稍后使用 nx.k_core
,这不适用于有向图。关于的建议
如何继续将受到高度赞赏。
为什么不在将边添加到图中时将权重分配给边?
ed_ls = [(0, 1), (0, 63), (1, 2), (1, 3), (54, 0)]
ed_w = [1, 2, 3, 4, 5]
G = nx.Graph()
for i in range(len(ed_ls)):
src, dst = ed_ls[i]
G.add_edge(src, dst, weight=ed_w[i])
您可以使用 Graph.add_weighted_edges_from
来简化此操作:
ed_ls = [(0, 1), (0, 63), (1, 2), (1, 3), (54, 0)]
ed_w = [1, 2, 3, 4, 5]
G = nx.Graph()
G.add_weighted_edges_from(((*edge, w) for edge, w in zip(ed_ls, ed_w)))
G.edges(data=True)
EdgeDataView([(0, 1, {'weight': 1}), (0, 63, {'weight': 2}),
(0, 54, {'weight': 5}), (1, 2, {'weight': 3}),
(1, 3, {'weight': 4})])
如果您使用的是 3.7 以上的 python 版本,字典会保持插入顺序,但您在打印 G.edges(data=True)
时看到的顺序不一定是边添加的顺序,而是同意节点添加。如您在此示例中所见,(54, 0)
显示在前面
(1, 2)
因为之前添加了节点 0
。