使用 nx.to_numpy_array 时邻接矩阵中的有序节点

DeD*_*233 4 python networkx

我创建了一个带有一些边的图:

\n
import networkx as nx\n\ng = nx.Graph()\ng.add_edge(1, 2)\ng.add_edge(2, 6)\ng.add_edge(3, 4)\ng.add_edge(5, 6)\n\nprint(g.edges)\n
Run Code Online (Sandbox Code Playgroud)\n
output-> (1, 2), (1, 5), (2, 6), (5, 6), (3, 4)\n
Run Code Online (Sandbox Code Playgroud)\n

然后A利用图进行相邻g

\n
nx.convert_matrix.to_numpy_array(g)\n
Run Code Online (Sandbox Code Playgroud)\n

结果是:

\n
array([[0., 1., 1., 0., 0., 0.],\n       [1., 0., 0., 1., 0., 0.],\n       [1., 0., 0., 1., 0., 0.],\n       [0., 1., 1., 0., 0., 0.],\n       [0., 0., 0., 0., 0., 1.],\n       [0., 0., 0., 0., 1., 0.]])\n
Run Code Online (Sandbox Code Playgroud)\n

g如果您将相邻元素的索引视为如下,您可以看到相邻不匹配:

\n
A :   1 2 3 4 5 6\n     \xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\n  1 | 0 1 1 0 0 0\n  2 | 1 0 0 1 0 0\n  3 | 1 0 0 1 0 0\n  4 | 0 1 1 0 0 0\n  5 | 0 0 0 0 0 1\n  6 | 0 0 0 0 1 0\n
Run Code Online (Sandbox Code Playgroud)\n

例如:

\n

在 上,索引(1, 3)A的值通常等于1 ,这意味着边(1, 3)存在,但实际上不存在!

\n

如果我将索引更改A为如下所示:

\n
A :   1 2 5 6 3 4\n     \xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\n  1 | 0 1 1 0 0 0\n  2 | 1 0 0 1 0 0\n  5 | 1 0 0 1 0 0\n  6 | 0 1 1 0 0 0\n  3 | 0 0 0 0 0 1\n  4 | 0 0 0 0 1 0\n
Run Code Online (Sandbox Code Playgroud)\n

比赛将在edges和之间进行A

\n

我的问题

\n

如何使A的索引遵循正常顺序 -> 1,2,3,4...

\n

先谢谢啦~

\n

yat*_*atu 5

作为 的结果to_numpy_matrix,节点出现的顺序取决于边的插入顺序,即节点添加到图中的顺序。您可以使用以下命令检查邻接矩阵的实际顺序nx.to_pandas_adjacency

g = nx.Graph()
g.add_edge(1, 2)
g.add_edge(2, 6)
g.add_edge(3, 4)
g.add_edge(5, 6)
g.edges()
# EdgeView([(1, 2), (2, 6), (6, 5), (3, 4)])

nx.to_pandas_adjacency(g)

     1    2    6    3    4    5
1  0.0  1.0  0.0  0.0  0.0  0.0
2  1.0  0.0  1.0  0.0  0.0  0.0
6  0.0  1.0  0.0  0.0  0.0  1.0
3  0.0  0.0  0.0  0.0  1.0  0.0
4  0.0  0.0  0.0  1.0  0.0  0.0
5  0.0  0.0  1.0  0.0  0.0  0.0
Run Code Online (Sandbox Code Playgroud)

要获取具有有序节点的邻接矩阵,您可以使用nodelist中的参数nx.to_numpy_matrix,并为其提供排序的节点列表:

nx.to_numpy_matrix(g, nodelist=sorted(g.nodes()))

matrix([[0., 1., 0., 0., 0., 0.],
        [1., 0., 0., 0., 0., 1.],
        [0., 0., 0., 1., 0., 0.],
        [0., 0., 1., 0., 0., 0.],
        [0., 0., 0., 0., 0., 1.],
        [0., 1., 0., 0., 1., 0.]])
Run Code Online (Sandbox Code Playgroud)

这与通过重新索引邻接数据框中的轴得到的结果相同:

nodes_sorted = sorted(g.nodes())
nx.to_pandas_adjacency(g).reindex(index=nodes_sorted, columns=nodes_sorted)

    1    2    3    4    5    6
1  0.0  1.0  0.0  0.0  0.0  0.0
2  1.0  0.0  0.0  0.0  0.0  1.0
3  0.0  0.0  0.0  1.0  0.0  0.0
4  0.0  0.0  1.0  0.0  0.0  0.0
5  0.0  0.0  0.0  0.0  0.0  1.0
6  0.0  1.0  0.0  0.0  1.0  0.0
Run Code Online (Sandbox Code Playgroud)

  • 惊人的 !我正在考虑一些复杂的方法来处理它......感谢您的回答,这对我有很大帮助。 (2认同)