Python 重命名节点时NetworkX中的两部分无法正常工作

Python 重命名节点时NetworkX中的两部分无法正常工作,python,networkx,bipartite,Python,Networkx,Bipartite,我正在尝试使用networkX将二部图转换为人际图: import networkx as nx import ast from networkx.algorithms import bipartite x=(161,1),(589,2),(162,1),(163,1),(589,2) BI = nx.Graph() BI.add_edges_from(x) bottom_nodes, top_nodes = bipartite.sets(BI) GI = bipartite.projected

我正在尝试使用networkX将二部图转换为人际图:

import networkx as nx
import ast
from networkx.algorithms import bipartite
x=(161,1),(589,2),(162,1),(163,1),(589,2)
BI = nx.Graph()
BI.add_edges_from(x)
bottom_nodes, top_nodes = bipartite.sets(BI)
GI = bipartite.projected_graph(BI, top_nodes)
GI.edges()
结果不正确:

>>> bottom_nodes
{161, 162, 163, 2}
>>> top_nodes
{1, 589}
如果我将x更改为:

x=(61,1),(58,2),(62,1),(63,1),(59,2)
我得到的正确结果是:

>>> bottom_nodes
{1, 2}
>>> top_nodes
{58, 59, 61, 62, 63}

因此,如果我对节点使用“较低”的数字,那么转换是正确的,否则就不正确了。但是,我需要更大的数字,因为我有100多个节点。

二部图中的节点集是等价的(如果我使用了错误的术语,请纠正我)——没有什么主要区别,可以将哪个称为“顶部”和哪个称为“底部”

根据中的参考文献,将其分类是特定应用中商定的惯例(为了统一),而不是任何数学差异。所以,两个答案实际上都是正确的

查看
networkx.algorithms.bipartite.sets
的源代码,它将委托给
networkx.algorithms.bipartite.color
,后者依次在节点上迭代。对于G中的n,在
中排在第一位的节点总是被分配颜色
1
,并进入
集合中的第一个集合:

In [2]: x=(161,1),(589,2),(162,1),(163,1),(589,2)
In [4]: g=networkx.Graph(x)
In [8]: g2=networkx.Graph(((80,2),(589,2),(162,1),(163,1),(589,2)))

In [11]: [n for n in g]
Out[11]: [161, 2, 163, 1, 162, 589]

In [12]: [n for n in g2]
Out[12]: [1, 2, 163, 162, 589, 80]

In [14]: networkx.algorithms.bipartite.sets(g)
Out[14]: ({2, 161, 162, 163}, {1, 589})

In [13]: networkx.algorithms.bipartite.sets(g2)
Out[13]: ({1, 2}, {80, 162, 163, 589})

因此,如果您对节点的哪些不相关属性应将其分类为“顶部”/“底部”有一些具体的想法,那么您需要对其进行实际编程:例如,查看结果并查看结果。

既然您已经知道您的二部集是什么,您可以显式地指定它们

import networkx as nx                                                           
from networkx.algorithms import bipartite                                       
x=(161,1),(589,2),(162,1),(163,1),(589,2)                                       
BI = nx.Graph(x)                                                                
top = set(s for s,t in x)                                                       
print(top)                                                                      
GI = bipartite.projected_graph(BI, top)                                         
print(list(GI.edges()))  
输出

set([161, 162, 163, 589])
[(161, 162), (161, 163), (162, 163)]

相关:作为旁注,您可以直接编写
BI=nx.Graph(x)