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

Python 如何在矩阵中搜索连接元素?,python,pandas,matrix,networkx,graph-theory,Python,Pandas,Matrix,Networkx,Graph Theory,我有这样一个矩阵: In [1]: df = pd.DataFrame([[0, 0, 1, 1, 1], [0, 0, 0, 1, 0], [1, 0, 0, 0, 0], [1, 1, 0, 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

我有这样一个矩阵:

In [1]: df = pd.DataFrame([[0, 0, 1, 1, 1], [0, 0, 0, 1, 0], [1, 0, 0, 0, 0], [1, 1, 0, 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”。 我可以使用for循环,但对于300x300矩阵来说速度太慢了。我怎样才能解决这个问题

更新1:

df = pd.DataFrame([[0, 0, 1, 0, 0, 1], [0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 1, 1], [0, 0, 1, 1, 0, 0], [1, 0, 0, 0, 0, 0]], columns = list('ABCDEF'), index = list('ABCDEF'))
在这种情况下,解决方案是最长的循环['D'、'F'、'A'、'C'、'E']

是否可能只有完全连接的元素,如示例中所示的“C”、“D”、“E”


从图论的角度来看,你似乎在寻找IIUC的是。通过使用
NetworkX
,从邻接矩阵生成一个图形,可以找到循环:

import networkx as nx

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

您可以通过找到图表周期,并从中轻松获得最长周期:

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

更新-

如果在这些“循环”中只需要完全连接的元素,那么需要的是图形。首先必须转换为无向,因为
nx.find\u cliques
不是为有向图定义的,然后使用
len
作为关键函数来查找
max

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


你想要实际的元素还是元素的数量?实际的元素!更新@Giovanniruggierit解决方案正常,但4小时后,在244x 244矩阵上,该过程尚未完成。猜测循环函数的复杂性很高,特别是对于高度连通的图@GiovanniRuggieri非常惊讶,它可以在一个如此大小的adj矩阵上花费如此长的时间,尽管你可能会发现这个线程很有见地,为什么它会变得非常慢@GiovanniRuggieri也尝试过,但没有使用len参数。你能解释一下len参数的用途吗?该参数用于
max
功能。它找到了最大值,使用了可伸缩缝的长度作为找到最大值的标准。@GiovanniRuggieri
max(nx.find_cliques(H), key=len)
# ['D', 'E', 'C']