如何解决如何在矩阵中搜索连接的元素?
我有一个这样的矩阵:
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”?
解决方法
从图论的角度看,您正在寻找的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')
您可以通过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')
max(nx.find_cliques(H),key=len)
# ['D','E','C']
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。