NetworkX 给出了错误的边缘索引

NetworkX gives wrong edge indices

提问人:user3748950 提问时间:7/11/2023 更新时间:7/11/2023 访问量:31

问:

我有以下函数,将两个 NetworkX 图作为输入。 我调试打印了邻接矩阵和 NetworkX 返回的边缘,它们不匹配。如果我对邻接矩阵进行硬编码,一切都按预期工作。请查看下面的代码和输出。

def prepareData(g1, g2):
graphs = [(g1, g2)]

Graphs = []
for graph in graphs:
    for inergraph in graph:
        Graphs.append(inergraph)

graphs = Graphs

for i, g in enumerate(graphs):
    n_nodes = g.number_of_nodes()
    n_edges = g.number_of_edges()

    edges = np.array(g.edges(), dtype=np.int32)

    print(nx.to_numpy_array(g))
    print()
    print(edges)
    print()

这将产生以下输出:

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

[[ 4  5]
 [ 4 10]
 [ 5  7]
 [ 6  7]
 [ 8  9]]

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

[[ 4  5]
 [ 4 10]
 [ 5  7]
 [ 6  7]
 [ 8  9]]

对邻接矩阵进行硬编码

a = np.array([[0, 1, 0, 0, 0, 0, 1, 0, 0],
              [1, 0, 0, 1, 0, 0, 0, 0, 0],
              [0, 0, 0, 1, 0, 0, 0, 0, 0],
              [0, 1, 1, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 1, 0, 0, 0],
              [0, 0, 0, 0, 1, 0, 0, 0, 0],
              [1, 0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 0, 0, 0, 0]])

b = np.array([[0, 1, 0, 0, 0, 0, 1, 0, 0,],
               [1, 0, 0, 1, 0, 0, 0, 0, 0,],
               [0, 0, 0, 1, 0, 0, 0, 0, 0,],
               [0, 1, 1, 0, 0, 0, 0, 0, 0,],
               [0, 0, 0, 0, 0, 1, 0, 0, 0,],
               [0, 0, 0, 0, 1, 0, 0, 0, 0,],
               [1, 0, 0, 0, 0, 0, 0, 0, 0,],
               [0, 0, 0, 0, 0, 0, 0, 0, 0,],
               [0, 0, 0, 0, 0, 0, 0, 0, 0,]])

g1 = nx.from_numpy_array(a)
g2 = nx.from_numpy_array(b)

产生以下结果

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

[[0 1]
 [0 6]
 [1 3]
 [2 3]
 [4 5]]

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

[[0 1]
 [0 6]
 [1 3]
 [2 3]
 [4 5]]

有人可以指出为什么我得到如此不同的输出,而后者似乎是正确的吗?

我真的很感激任何帮助。

Python 图形 networkx 邻接矩阵

评论


答:

0赞 user3748950 7/11/2023 #1

有人发布了一个答案,但随后立即删除了它。如果您再次发布您的答案,我可以接受它作为解决方案。我不完全确定为什么首先会出现这个问题,必须与NetworkX在内部管理节点标签的方式有关。在检索边缘之前添加以下行可以解决问题:

g = nx.convert_node_labels_to_integers(g)
edges = np.array(g.edges(), dtype=np.int32)