networkx.to_numpy_matrix(或置换numpy矩阵)的问题

时间:2015-07-09 14:02:17

标签: python numpy permutation networkx

我对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的置换,这是一个双射,因此两个图都是同构的。在这种情况下的排列是这个

perms = [4, 3, 2, 1, 0, 5, 6, 7, 8]

(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是正确的,我知道矩阵是正确的,我知道两个图都是同构的。如何通过g1正确排列permsg2

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

我的问题的答案很简单。我的排列错误的方式。示例1只是没有抛出错误,因为排列是对称的(仅1 -> 33 -> 1)。当我改变排列时,我得到了我想要的东西。所以这一切都按照预期的方式发挥作用。