Python networkx中如何区分等价图

Python networkx中如何区分等价图,python,numpy,graph,networkx,Python,Numpy,Graph,Networkx,我有一个关于图等价性的问题 假设: import networkx as nx import numpy as np def is_isomorphic(graph1, graph2): G1 = nx.from_numpy_matrix(graph1) G2 = nx.from_numpy_matrix(graph2) isomorphic = nx.is_isomorphic(G1,G2, edge_match=lambda x, y: x==y) retu

我有一个关于图等价性的问题

假设:

import networkx as nx
import numpy as np

def is_isomorphic(graph1, graph2):
    G1 = nx.from_numpy_matrix(graph1)
    G2 = nx.from_numpy_matrix(graph2)
    isomorphic = nx.is_isomorphic(G1,G2, edge_match=lambda x, y: x==y)
    return isomorphic


graph1 = np.array([[1, 1, 0],
                   [0, 2, 1],
                   [0, 0, 3]])
graph2 = np.array([[1, 0, 1],
                   [0, 2, 1],
                   [0, 0, 3]])

graph3 = np.array([[1, 0, 1],
                   [0, 1, 1],
                   [0, 0, 2]])
graph4 = np.array([[1, 1, 1],
                   [0, 1, 0],
                   [0, 0, 2]])

print(is_isomorphic(graph1,graph2))
# should return True
print(is_isomorphic(graph3,graph4))
# should return False
第一个
是同构的(graph1,graph2)
应该返回True,因为顶点标签对我来说只是虚拟变量。在第一种情况下,顶点2绑定到两个不同的顶点;在第二种情况下,顶点3绑定到两个不同的顶点

第二个
是同构的(graph3,graph4)
应该返回False,因为在
graph3
中,顶点2绑定到相同的两个顶点;在
图4
中,顶点1与两种不同类型的顶点相结合

有没有一种类似蟒蛇的方法来解决这个问题?由于我只对邻接矩阵感兴趣,如果这能加快计算速度,那么就可以发出包
networkx

注意:这个问题也必须可扩展到更大的邻接矩阵。

以下内容适用于您给定的示例(希望通常能满足您的要求):

将networkx导入为nx
将numpy作为np导入
def同构(图1,图2):
G1=nx.从矩阵(图1)
G2=nx.来自矩阵(图2)
#删除自循环(由上述调用创建)
#并为节点类型添加“阴影节点”
对于列表中的节点(G1.节点):
G1.移除_边(节点,节点)
G1.添加_边(节点,“类型”+str(图1[节点,节点])
对于列表中的节点(G2.节点):
G2.删除_边(节点,节点)
G2.添加_边(节点,“类型”+str(图2[节点,节点])
同构=nx.是同构的(G1,G2,边匹配=λx,y:x==y,
)
返回同构
graph1=np.array([[1,1,0],
[0, 2, 1],
[0, 0, 3]])
graph2=np.array([[1,0,1],
[0, 2, 1],
[0, 0, 3]])
graph3=np.array([[1,0,1],
[0, 1, 1],
[0, 0, 2]])
graph4=np.array([[1,1,1],
[0, 1, 0],
[0, 0, 2]])
打印(同构(图1,图2))
#真的
印刷品(同构(图3、图4))
#假的

以下内容适用于您给定的示例(希望能够实现您想要的目标):

将networkx导入为nx
将numpy作为np导入
def同构(图1,图2):
G1=nx.从矩阵(图1)
G2=nx.来自矩阵(图2)
#删除自循环(由上述调用创建)
#并为节点类型添加“阴影节点”
对于列表中的节点(G1.节点):
G1.移除_边(节点,节点)
G1.添加_边(节点,“类型”+str(图1[节点,节点])
对于列表中的节点(G2.节点):
G2.删除_边(节点,节点)
G2.添加_边(节点,“类型”+str(图2[节点,节点])
同构=nx.是同构的(G1,G2,边匹配=λx,y:x==y,
)
返回同构
graph1=np.array([[1,1,0],
[0, 2, 1],
[0, 0, 3]])
graph2=np.array([[1,0,1],
[0, 2, 1],
[0, 0, 3]])
graph3=np.array([[1,0,1],
[0, 1, 1],
[0, 0, 2]])
graph4=np.array([[1,1,1],
[0, 1, 0],
[0, 0, 2]])
打印(同构(图1,图2))
#真的
印刷品(同构(图3、图4))
#假的

邻接矩阵对角线项中的
int
(?)值的含义是什么?这是顶点的类型吗?还是自循环的数量?如果您想拥有节点类型,您可能需要查看
nx的
node\u match
参数。是否同构
对角线条目是顶点的类型。所以我想要一个选项,如果我在
graph1
中更改顶点标签3->2和顶点2->3,那么我将获得
graph2
,这意味着这些图形是“等价的”。邻接矩阵的对角项中
int
(?)值的含义是什么?这是顶点的类型吗?还是自循环的数量?如果您想拥有节点类型,您可能需要查看
nx的
node\u match
参数。是否同构
对角线条目是顶点的类型。所以我想要一个选项,如果我在
graph1
中更改顶点标签3->2和顶点2->3,那么我将获得
graph2
,这意味着这些图形是“等效的”。谢谢!这确实有效,但是否有可能不必移除自循环,并立即创建一个“正确”的G1和G2,脱离作为邻接矩阵的numpy矩阵?我不认为有更快的方法,因为在任何情况下都需要在节点上循环,移除自循环不应该是一个昂贵的操作(从口述中删除)。如果此答案解决了您的问题,您应该将其标记为已接受答案(和您以前问题中的其他帖子类似;)谢谢!这确实有效,但是否有可能不必移除自循环,并立即创建一个“正确”的G1和G2,脱离作为邻接矩阵的numpy矩阵?我不认为有更快的方法,因为在任何情况下都需要在节点上循环,移除自循环不应该是一个昂贵的操作(从dict中删除)。若这个答案解决了你们的问题,你们应该将它标记为接受答案(和你们以前问题中的其他帖子类似;)