使用 nx.to_numpy_array 时邻接矩阵中的有序节点
Ordered nodes in adjacency matrix when using nx.to_numpy_array
我创建了一个有一些边的图:
import networkx as nx
g = nx.Graph()
g.add_edge(1, 2)
g.add_edge(2, 6)
g.add_edge(3, 4)
g.add_edge(5, 6)
print(g.edges)
output-> (1, 2), (1, 5), (2, 6), (5, 6), (3, 4)
然后利用图g
得到相邻A
nx.convert_matrix.to_numpy_array(g)
结果是:
array([[0., 1., 1., 0., 0., 0.],
[1., 0., 0., 1., 0., 0.],
[1., 0., 0., 1., 0., 0.],
[0., 1., 1., 0., 0., 0.],
[0., 0., 0., 0., 0., 1.],
[0., 0., 0., 0., 1., 0.]])
如果将adjacent上的元素索引看成下面这样,就可以看到adjacent不匹配g
:
A : 1 2 3 4 5 6
—————————————
1 | 0 1 1 0 0 0
2 | 1 0 0 1 0 0
3 | 1 0 0 1 0 0
4 | 0 1 1 0 0 0
5 | 0 0 0 0 0 1
6 | 0 0 0 0 1 0
例如:
在A
上,索引(1, 3)的值和往常一样等于1,这意味着边缘(1, 3) 存在,但实际上不存在!
如果我将 A
的索引更改为如下所示:
A : 1 2 5 6 3 4
—————————————
1 | 0 1 1 0 0 0
2 | 1 0 0 1 0 0
5 | 1 0 0 1 0 0
6 | 0 1 1 0 0 0
3 | 0 0 0 0 0 1
4 | 0 0 0 0 1 0
比赛将在 edges
和 A
之间进行。
我的问题
如何使 A
的索引遵循正常顺序 -> 1,2,3,4...
提前致谢~
由于 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
要获得具有 有序 节点的邻接矩阵,您可以使用 nx.to_numpy_matrix
中的 nodelist
参数,并为其提供排序的节点列表:
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.]])
这与通过重新索引邻接数据框中的轴得到的相同:
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
我创建了一个有一些边的图:
import networkx as nx
g = nx.Graph()
g.add_edge(1, 2)
g.add_edge(2, 6)
g.add_edge(3, 4)
g.add_edge(5, 6)
print(g.edges)
output-> (1, 2), (1, 5), (2, 6), (5, 6), (3, 4)
然后利用图g
A
nx.convert_matrix.to_numpy_array(g)
结果是:
array([[0., 1., 1., 0., 0., 0.],
[1., 0., 0., 1., 0., 0.],
[1., 0., 0., 1., 0., 0.],
[0., 1., 1., 0., 0., 0.],
[0., 0., 0., 0., 0., 1.],
[0., 0., 0., 0., 1., 0.]])
如果将adjacent上的元素索引看成下面这样,就可以看到adjacent不匹配g
:
A : 1 2 3 4 5 6
—————————————
1 | 0 1 1 0 0 0
2 | 1 0 0 1 0 0
3 | 1 0 0 1 0 0
4 | 0 1 1 0 0 0
5 | 0 0 0 0 0 1
6 | 0 0 0 0 1 0
例如:
在A
上,索引(1, 3)的值和往常一样等于1,这意味着边缘(1, 3) 存在,但实际上不存在!
如果我将 A
的索引更改为如下所示:
A : 1 2 5 6 3 4
—————————————
1 | 0 1 1 0 0 0
2 | 1 0 0 1 0 0
5 | 1 0 0 1 0 0
6 | 0 1 1 0 0 0
3 | 0 0 0 0 0 1
4 | 0 0 0 0 1 0
比赛将在 edges
和 A
之间进行。
我的问题
如何使 A
的索引遵循正常顺序 -> 1,2,3,4...
提前致谢~
由于 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
要获得具有 有序 节点的邻接矩阵,您可以使用 nx.to_numpy_matrix
中的 nodelist
参数,并为其提供排序的节点列表:
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.]])
这与通过重新索引邻接数据框中的轴得到的相同:
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