问题networkx.to\u numpy_矩阵(或置换numpy矩阵)

2024-05-19 12:51:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我对networkx.to_numpy_matrix的工作方式有问题。在

前言:(以实例说明)
我正在开发自己的实现来检查图的同构。我用两张图来表示。在

cc1:  [[8], [4], [7], [1], [3], [5], [2], [0], [6]]
cc2:  [[8], [0], [7], [3], [1], [5], [2], [4], [6]]

它代表了我图中每个节点的唯一着色。有了这个,我直接得到了从图1到图2的置换,这是一个双射,所以两个图是同构的。这种情况下的排列是这样的

^{pr2}$

(0 -> 4, 1 -> 3, 2 -> 2, 3 -> 1, 4 -> 0, 5 -> 5, 6 -> 6, 7 -> 7, 8 -> 8)

现在我想检查这个排列是否真的正确(因为我可以得到一些不同的排列,它们是竞争者,所以我必须全部尝试。在这种情况下,我只得到一个排列)。所以我用nx.to_numpy_matrix(self.g1)查看我的邻接矩阵,得到

[[ 0.  1.  0.  0.  0.  0.  0.  0.  0.]
 [ 1.  0.  1.  0.  0.  0.  0.  0.  1.]
 [ 0.  1.  0.  1.  0.  0.  0.  0.  0.]
 [ 0.  0.  1.  0.  1.  1.  0.  0.  0.]
 [ 0.  0.  0.  1.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  1.  0.  0.  1.  1.  0.]
 [ 0.  0.  0.  0.  0.  1.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  1.  0.  0.  0.]
 [ 0.  1.  0.  0.  0.  0.  0.  0.  0.]]

现在我把我的排列应用到矩阵上

nx.to_numpy_matrix(self.g1, perms)

然后得到

[[ 0.  1.  0.  0.  0.  0.  0.  0.  0.]
 [ 1.  0.  1.  0.  0.  1.  0.  0.  0.]
 [ 0.  1.  0.  1.  0.  0.  0.  0.  0.]
 [ 0.  0.  1.  0.  1.  0.  0.  0.  1.]
 [ 0.  0.  0.  1.  0.  0.  0.  0.  0.]
 [ 0.  1.  0.  0.  0.  0.  1.  1.  0.]
 [ 0.  0.  0.  0.  0.  1.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  1.  0.  0.  0.]
 [ 0.  0.  0.  1.  0.  0.  0.  0.  0.]]

等于

nx.to_numpy_matrix(self.g2)
[[ 0.  1.  0.  0.  0.  0.  0.  0.  0.]
 [ 1.  0.  1.  0.  0.  1.  0.  0.  0.]
 [ 0.  1.  0.  1.  0.  0.  0.  0.  0.]
 [ 0.  0.  1.  0.  1.  0.  0.  0.  1.]
 [ 0.  0.  0.  1.  0.  0.  0.  0.  0.]
 [ 0.  1.  0.  0.  0.  0.  1.  1.  0.]
 [ 0.  0.  0.  0.  0.  1.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  1.  0.  0.  0.]
 [ 0.  0.  0.  1.  0.  0.  0.  0.  0.]]

所以这起作用了。两个图应该是同构的,我得到了相同的结果。耶!在

问题:
问题是它并不总是有效的。我的问题从下一个同样应该同构的例子开始。在

cc1:  [[6], [7], [4], [5], [0], [1], [2], [3]]
cc2:  [[5], [7], [4], [1], [0], [3], [2], [6]]
perms: [0, 3, 2, 6, 4, 1, 5, 7]

到目前为止还不错

nx.to_numpy_matrix(self.g1)
[[ 0.  1.  0.  0.  0.  0.  1.  0.]
 [ 1.  0.  0.  0.  1.  0.  0.  0.]
 [ 0.  0.  0.  1.  0.  0.  0.  1.]
 [ 0.  0.  1.  0.  0.  0.  0.  1.]
 [ 0.  1.  0.  0.  0.  1.  0.  0.]
 [ 0.  0.  0.  0.  1.  0.  1.  0.]
 [ 1.  0.  0.  0.  0.  1.  0.  0.]
 [ 0.  0.  1.  1.  0.  0.  0.  0.]]

nx.to_numpy_matrix(self.g1, perms)
[[ 0.  0.  0.  1.  0.  1.  0.  0.]
 [ 0.  0.  1.  0.  0.  0.  0.  1.]
 [ 0.  1.  0.  0.  0.  0.  0.  1.]
 [ 1.  0.  0.  0.  0.  0.  1.  0.]
 [ 0.  0.  0.  0.  0.  1.  1.  0.]
 [ 1.  0.  0.  0.  1.  0.  0.  0.]
 [ 0.  0.  0.  1.  1.  0.  0.  0.]
 [ 0.  1.  1.  0.  0.  0.  0.  0.]]

nx.to_numpy_matrix(self.g2)
[[ 0.  0.  0.  1.  0.  1.  0.  0.]
 [ 0.  0.  0.  0.  1.  1.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  1.  1.]
 [ 1.  0.  0.  0.  1.  0.  0.  0.]
 [ 0.  1.  0.  1.  0.  0.  0.  0.]
 [ 1.  1.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  1.  0.  0.  0.  0.  1.]
 [ 0.  0.  1.  0.  0.  0.  1.  0.]]

这是不平等的。为什么nx.to_numpy_matrix(self.g1, perms)没有像我期望的那样工作?我用错了吗?
我知道perms是正确的,我知道矩阵是正确的,我知道两个图是同构的。如何使g1perms正确置换以到达g2?在

任何帮助都将不胜感激。在


Tags: toselfnumpynetworkx方式情况矩阵matrix
1条回答
网友
1楼 · 发布于 2024-05-19 12:51:26

我的问题的答案很简单。我的排列方式不对。示例1没有抛出错误,因为置换是对称的(只有1 -> 3和{})。当我切换排列时,我得到了我想要的。所以一切都按预期进行。在

相关问题 更多 >