【问题标题】:Problems with networkx.to_numpy_matrix (or permutating a numpy matrix)networkx.to_numpy_matrix 的问题(或置换 numpy 矩阵)
【发布时间】:2015-07-09 14:02:16
【问题描述】:

我对@9​​87654321@ 的工作方式有疑问。

前言:(带有工作示例)
我正在开发自己的实现来检查图同构。通过大量的工作,我得到了这样的两个图表的表示。

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 是正确的,我知道矩阵是正确的,并且我知道两个图都是同构的。如何让g1perms 正确排列以得到g2

任何帮助将不胜感激。

【问题讨论】:

  • 如果您没有在 nx.to_numpy_matrix() 中指定节点顺序(perms),那么结果是任意的,因为节点的顺序是方法 G.nodes() 返回它们。因此,您可能需要指定顺序 [0, 1, 2, ...] 以确保所有内容都按您想要的顺序排序。

标签: python numpy permutation networkx


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2012-05-06
    • 1970-01-01
    • 2016-09-28
    • 2015-02-04
    • 1970-01-01
    • 2021-02-25
    相关资源
    最近更新 更多