我将写一个例子来阐明我的意思:
test = nx.Graph()
test.add_edge(0,3)
test.add_edge(1,2)
test.nodes
Out: NodeView((0, 3, 1, 2))
nx.to_numpy_matrix(test)
Out: matrix([[0., 1., 0., 0.],
[1., 0., 0., 0.],
[0., 0., 0., 1.],
[0., 0., 1., 0.]])
因此,如果您查看上面的示例,则可以看到networkx按照将节点添加到图中的顺序对节点进行排序。
问题是我需要按照给节点的编号对邻接矩阵进行排序。因此,对于我的示例,最终矩阵必须为:
Out: matrix([[0., 0., 0., 1.],
[0., 0., 1., 0.],
[0., 1., 0., 0.],
[1., 0., 0., 0.]])
此外,我正在从边缘列表文件中读取图形。
最后,我的实际问题是输出矩阵的索引与图中的索引不同。因此,对于我的示例,如果我要检查矩阵中的节点1,则必须写入matrix [2],因为它是我在边缘列表中写入的第三个节点。 有人知道我该怎么解决吗?
答案 0 :(得分:1)
如果您事先知道节点,则可以在添加边之前将其添加到图形中。例如,
>>> G = nx.Graph()
>>> G.add_node(0)
>>> G.add_node(1)
>>> G.add_node(2)
>>> G.add_node(3)
>>> G.add_edge(0,3)
>>> G.add_edge(1,2)
>>> G.nodes
NodeView((0, 1, 2, 3))
>>> nx.to_numpy_matrix(G)
matrix([[0., 0., 0., 1.],
[0., 0., 1., 0.],
[0., 1., 0., 0.],
[1., 0., 0., 0.]])
或者,查看API文档,您可以轻松完成
print(nx.to_numpy_matrix(test, nodelist=[0,1,2,3]))
输出:
[[0. 0. 0. 1.]
[0. 0. 1. 0.]
[0. 1. 0. 0.]
[1. 0. 0. 0.]]