如何在矩阵中搜索连接的元素?

问题描述

我有一个这样的矩阵:

In [1]: df = pd.DataFrame([[0,1,1],[0,0],[1,0]],columns = list('ABCDE'),index = list('ABCDE'))

In [2]:df
Out[2]: 
   A  B  C  D  E
A  0  0  1  1  1
B  0  0  0  1  0
C  1  0  0  0  0
D  1  1  0  0  1
E  1  0  0  1  0

数字1表示两个元素之间的连接。在这种情况下,“ A”连接到“ D”,“ E”和“ D”连接到“ E”,形成由三个元素形成的闭合连接。 我寻找的是相互连接的元素数量最多,在这种情况下为“ A”,“ D”,“ E”。 我可以使用循环,但是对于300x300矩阵来说,它变得太慢了。我该怎么解决

更新1:

df = pd.DataFrame([[0,columns = list('ABCDEF'),index = list('ABCDEF'))

在这种情况下,解决方案是最长的周期['D','F','A','C','E']。

是否可能只有全部连接的元素,例如在示例中显示的“ C”,“ D”,“ E”?

enter image description here

解决方法

从图论的角度看,您正在寻找的IIUC是graph cycles。您可以通过使用NetworkX从邻接矩阵生成图来找到循环:

import networkx as nx

G = nx.from_pandas_adjacency(df,create_using=nx.DiGraph)
nx.draw(G,with_labels=True,node_color='lightblue')

enter image description here

您可以通过nx.simple_cycles找到图形循环,然后从那里轻松获取最长的循环:

max(nx.simple_cycles(G),key=len)
# ['E','D','A']

更新-

如果您只想在那些“周期”中使用完全连接的元素,则需要图cliques。由于没有为有向图定义nx.find_cliques,因此您首先必须转换为无向图,然后使用max作为关键函数来找到len

H = G.to_undirected()
nx.draw(H,node_color='lightblue')

enter image description here

max(nx.find_cliques(H),key=len)
# ['D','E','C']