Python NetworkX - 从嵌套词典中获取有向图
Python NetworkX - get DiGraph from nested dictionaries
我正在尝试从嵌套字典在 python 的 NetworkX 中创建一个简单的有向图,但看起来内置初始化没有构建最终叶节点。
玩具示例:
class_hierarchy= {-1: ["A", "B"],
"A":{"A1":[1], "A2":[3,4]},
"B": {"B1":[5,6], "B2": [7,8]}}
建筑图:
G = DiGraph(class_hierarchy)
现在让我们看看里面有什么:
G.nodes
Out[86]: NodeView((-1, 'A', 'B', 'A1', 'A2', 'B1', 'B2'))
看起来最终节点没有添加
检查中:
list(G.successors('A'))
Out[88]: ['A1', 'A2']
看起来合理
但是:
list(G.successors('A1'))
Out[89]: []
我不知道为什么会这样? Documentation for NetworkX 指定:
incoming_graph_data (input graph (optional, default: None)) – 初始化图的数据。如果 None(默认),则创建一个空图。数据可以是to_networkx_graph()函数支持的任何格式,目前包括edge list, dict of dicts, dict of lists等...
知道我做错了什么吗?
您有一个混合输入,它既是 dict of lists
又是 dict of dicts
。
Networkx
会将其解释为 dict of lists
。
请参阅 following code,其中 data
在您的案例中是 class_hierarchy
。
if isinstance(data, dict):
try:
#this will raise an exception
return from_dict_of_dicts(data, create_using=create_using,
multigraph_input=multigraph_input)
except:
try:
# this is what is called in your case
return from_dict_of_lists(data, create_using=create_using)
except:
raise TypeError("Input is not known type.")
在您的情况下,networkx
需要列表邻接表示的字典。
例如,预期输入的形式为:key: value
-> node u: list of nodes [v1,v2,...,vn] u is connected with
(例如,{0: [1,2], 1: [3,4]}.
networkx 对您提供的输入的处理如下:
G=nx.DiGraph()
edges_list = [((node, nbr)) for node, nbrlist in d.items() for nbr in nbrlist]
# [(-1, 'A'), (-1, 'B'), ('A', 'A1'), ('A', 'A2'), ('B', 'B1'), ('B', 'B2')]
G.add_edges_from(edges_list)
因此,您必须根据赋予它的含义更改格式。
我正在尝试从嵌套字典在 python 的 NetworkX 中创建一个简单的有向图,但看起来内置初始化没有构建最终叶节点。
玩具示例:
class_hierarchy= {-1: ["A", "B"],
"A":{"A1":[1], "A2":[3,4]},
"B": {"B1":[5,6], "B2": [7,8]}}
建筑图:
G = DiGraph(class_hierarchy)
现在让我们看看里面有什么:
G.nodes
Out[86]: NodeView((-1, 'A', 'B', 'A1', 'A2', 'B1', 'B2'))
看起来最终节点没有添加
检查中:
list(G.successors('A'))
Out[88]: ['A1', 'A2']
看起来合理
但是:
list(G.successors('A1'))
Out[89]: []
我不知道为什么会这样? Documentation for NetworkX 指定:
incoming_graph_data (input graph (optional, default: None)) – 初始化图的数据。如果 None(默认),则创建一个空图。数据可以是to_networkx_graph()函数支持的任何格式,目前包括edge list, dict of dicts, dict of lists等...
知道我做错了什么吗?
您有一个混合输入,它既是 dict of lists
又是 dict of dicts
。
Networkx
会将其解释为 dict of lists
。
请参阅 following code,其中 data
在您的案例中是 class_hierarchy
。
if isinstance(data, dict):
try:
#this will raise an exception
return from_dict_of_dicts(data, create_using=create_using,
multigraph_input=multigraph_input)
except:
try:
# this is what is called in your case
return from_dict_of_lists(data, create_using=create_using)
except:
raise TypeError("Input is not known type.")
在您的情况下,networkx
需要列表邻接表示的字典。
例如,预期输入的形式为:key: value
-> node u: list of nodes [v1,v2,...,vn] u is connected with
(例如,{0: [1,2], 1: [3,4]}.
networkx 对您提供的输入的处理如下:
G=nx.DiGraph()
edges_list = [((node, nbr)) for node, nbrlist in d.items() for nbr in nbrlist]
# [(-1, 'A'), (-1, 'B'), ('A', 'A1'), ('A', 'A2'), ('B', 'B1'), ('B', 'B2')]
G.add_edges_from(edges_list)
因此,您必须根据赋予它的含义更改格式。