提问人:user3748950 提问时间:7/11/2023 更新时间:7/11/2023 访问量:31
NetworkX 给出了错误的边缘索引
NetworkX gives wrong edge indices
问:
我有以下函数,将两个 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]]
有人可以指出为什么我得到如此不同的输出,而后者似乎是正确的吗?
我真的很感激任何帮助。
答:
0赞
user3748950
7/11/2023
#1
有人发布了一个答案,但随后立即删除了它。如果您再次发布您的答案,我可以接受它作为解决方案。我不完全确定为什么首先会出现这个问题,必须与NetworkX在内部管理节点标签的方式有关。在检索边缘之前添加以下行可以解决问题:
g = nx.convert_node_labels_to_integers(g)
edges = np.array(g.edges(), dtype=np.int32)
评论