Python中NetworkX导入边时,有向图变为无向图的问题求助
解决NetworkX有向图变为无向图的问题
嘿,这个问题我之前也碰到过!核心原因是nx.from_pandas_edgelist的默认行为——它会创建一个新的无向图对象,不管你之前定义的G是什么类型,直接用这个新的无向图覆盖了你的有向图,所以才会出现nx.is_directed(G)从True变成False的情况。
具体解决方案
你只需要在调用from_pandas_edgelist时,通过create_using参数指定要使用的有向图类型即可,有两种常用方式:
方式1:在from_pandas_edgelist中指定有向图
直接告诉函数要基于有向图来创建边:
# 1. 创建空的有向图 G = nx.DiGraph() print(nx.is_directed(G)) # 输出: True # 2. 添加节点(这部分你的代码没问题) data = nodes.set_index("node").to_dict("index").items() G.add_nodes_from(data) print(nx.is_directed(G)) # 依然输出: True # 3. 导入边时指定使用有向图 G = nx.from_pandas_edgelist(edges, "from", "to", create_using=nx.DiGraph()) print(nx.is_directed(G)) # 现在输出: True
方式2:用add_edges_from添加边(更稳妥)
如果你不想重新赋值G,可以直接从DataFrame中提取边数据,用add_edges_from添加到已有的有向图中:
# 1. 创建空的有向图 G = nx.DiGraph() # 2. 添加节点 data = nodes.set_index("node").to_dict("index").items() G.add_nodes_from(data) # 3. 提取边并添加到有向图 edges_list = edges[["from", "to"]].itertuples(index=False, name=None) G.add_edges_from(edges_list) print(nx.is_directed(G)) # 输出: True
为什么原来的代码会出问题?
当你执行G = nx.from_pandas_edgelist(edges, "from", "to")时,函数默认使用create_using=nx.Graph()(无向图),所以它会生成一个全新的无向图对象,覆盖了你之前创建的nx.DiGraph()实例,这就是有向图变无向图的根源。而仅添加节点时,你只是在原来的有向图实例上操作,所以nx.is_directed(G)依然为True。
修改后,你就可以正常计算入度、出度以及其他有向图特有的中心性指标啦!
内容的提问来源于stack exchange,提问作者Jonaash
相关产品推荐
相关产品推荐

