我使用networkx
中的Python
创建了一个图表。
import networkx as nx
G = createGraph ('abc.csv') #My function that returns graph from file.
connected_components = nx.connected_components(G)
print (connected_components)
<generator object connected_components at 0x00000000221EF1A8>
nbr_cc = nx.number_connected_components(G)
print (nbr_cc)
57215
我想将每个连接的组件转换为clique,然后按以下方式编写csv文件:
node1_id node2_id connected_component_id
1 2 1
1 3 1
1 4 1
2 1 1
. . .
. . .
500 600 9
怎么做?有没有办法在notworkx或使用任何其他python库实现这一点?
答案 0 :(得分:1)
您可以使用itertools.permutations
:
>>> G
<networkx.classes.graph.Graph object at 0x7f123559f3c8>
>>> list(nx.connected_components(G))
[{0, 4, 5, 6, 7, 9}, {1}, {8, 2}, {3}]
>>> import itertools
>>> import csv
>>>
>>> with open('cliques.csv', 'tw') as f:
... w = csv.writer(f, csv.excel_tab)
... w.writerow(['node1', 'node2', 'clique'])
... w.writerows(p + (i,) for i, n in enumerate(nx.connected_components(G), 1) for p in itertools.permutations(n, 2))
...
20
创建一个包含以下内容的文件:
node1 node2 clique
0 4 1
0 5 1
0 6 1
0 7 1
0 9 1
4 0 1
4 5 1
...
9 6 1
9 7 1
8 2 3
2 8 3
答案 1 :(得分:1)
一旦你看看我使用的具体算法是如何在networkx中编码的,这个答案实际上与PaulPanzer的答案相同:
G=nx.Graph()
G.add_edges_from([(1,2), (2,3), (4,5), (5,6)])
list(nx.connected_components(G))
> [{1,2,3},{4,5,6}]
#we're done setting G up. Let's do it.
CCs = nx.connected_components(G)
complete_subgraphs = (nx.complete_graph(component) for component in CCs)
H=nx.compose_all(complete_subgraphs)
这里我们首先找到连接的组件(从技术上讲,我们为它们创建了一个生成器)。然后,我们使用nx.complete_graph(nodes)
找到所有这些组件的完整图表。最后,我们将所有图表与compose_all
一起加入。