使用NetworkX进行图的置换和旋转

3

我使用NetworkX生成一些图形类别。

我想对节点进行置换并以(80度、90度、120度)旋转图形。

如何在NetworkX上应用排列和旋转?

编辑_1:

给定一个图的邻接矩阵,我想以保留边缘和顶点链接的方式旋转图形。唯一改变的是节点的位置。

我想做的是将我的图旋转90度。

输入:

G图的邻接矩阵

过程:

对G图应用90度旋转

输出:

旋转后的邻接矩阵

这意味着该图保留其拓扑结构,只是邻接矩阵中的索引更改了位置。

例如,在旋转之前位于索引0处的节点1,在旋转后可能会在索引4处。

我尝试过的方法:
1)我查看了numpy.random.permutation(),但它似乎不接受旋转参数。

2)在networkX中,我没有找到任何允许旋转的函数。

EDIT2 给定一个5*5的邻接矩阵(5个节点):

adj=[[0,1,0,0,1],
[1,0,1,1,0],
[0,0,0,1,1],
[0,0,1,0,1],
[1,1,1,1,0]
]

我希望能够在索引之间进行置换。比如说,节点1取代节点3的位置,节点3取代节点4的位置,节点4取代节点1的位置。(保留它们之间的边缘关系)。

我希望在一个字典中保存原始索引和置换后新索引之间的映射关系。

其次,我希望对这个邻接矩阵进行置换或旋转,并以90度的角度进行旋转(就像对图像进行旋转一样)。我不确定应该如何实现。


你能举一个输入和期望输出的例子吗? - Joel
@Joel,请查看我的更新。希望清楚明了。 - eric lardon
这对我来说还不太清楚。看起来你在谈论节点的(x,y)坐标,但是你似乎也在重新标记节点。改变(x,y)坐标时不需要重新标记节点。 你能给出一个具体的输入以及该输入的期望输出吗? - Joel
@Joel,请查看我的更新示例。 - eric lardon
1个回答

3
请看networkx命令relabel_nodes。给定一个图G,如果我们想将节点0重命名为1,将1重命名为3,将3重命名为0(因此是节点的置换,保留2),我们创建字典mapping = {0:1, 1:3, 3:0}。然后我们执行:
H = nx.relabel_nodes(G, mapping)

H 现在是置换后的图。

import networkx as nx
G = nx.path_graph(4)  #0-1-2-3
mapping = {0:1, 1:3, 3:0}
H = nx.relabel_nodes(G, mapping) #1-3-2-0

#check G's adjacency matrix
print(nx.to_numpy_matrix(G,nodelist=[0,1,2,3]))
> [[ 0.  1.  0.  0.]
  [ 1.  0.  1.  0.]
  [ 0.  1.  0.  1.]
  [ 0.  0.  1.  0.]]

#check H's adjacency matrix
print(nx.to_numpy_matrix(H,nodelist=[0,1,2,3]))
> [[ 0.  0.  1.  0.]
  [ 0.  0.  0.  1.]
  [ 1.  0.  0.  1.]
  [ 0.  1.  1.  0.]]

非常感谢你,Joel。现在我需要一种自动映射的方法。你的例子是随机排列。现在我需要进行明确的排列(按给定方向旋转90°或70°)。 - eric lardon
1
你仍然需要解释在邻接矩阵的上下文中,“旋转”是什么意思,@ericlardon。 - Arya McCarthy
你能告诉我将路径网络G旋转70度会意味着什么吗? - Joel
这是一个好答案,但不幸的是,在最新版本的NetworkX中(我正在使用v2.3),它已经不再起作用了! - Tony Duan
实际上它是可行的,变化在于 nx.to_numpy_matrix 将节点放在不同的顺序中。我已经进行了更新以使其更清晰。 - Joel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接