【发布时间】:2019-04-24 18:34:49
【问题描述】:
我有一个 180x180 的邻接矩阵,我正在尝试生成所有合理的组合以使用 NetworkX。
我想依次删除部分图表,然后确定新编辑的图表对全局效率的影响。
在此视图中,一组合理的组合是彼此相邻的所有节点集,以及从假设它们彼此相邻到子图的所有可能的子图组合。
运行所有组合的蛮力方法太慢了,对于任何超过 15 个删除序列的运行时间约为 21 小时。因此,我们只想通过查看彼此相邻的组合来解决这个问题.
基本上代码需要做到以下几点:
- 导入包含二进制邻接矩阵的 csv,其中 1 表示物理连续性(在本例中为大脑)
- 导入networkx图
- 确定彼此之间的路径长度最多为 1 的所有组合集 ....换句话说,如果两个节点或两个节点集在任一端的距离大于 1,则它们将被忽略
- 为每个可能的组合生成这些节点集的列表
这是基本问题
假设大脑某个区域的物理空间包括几个大致像这样的区域......假设这些是镶嵌平面的不规则多边形
1 2 3 4 5
6 7 8 9
10 11
我们可以把它变成一个邻接矩阵,其中 1 表示区域共享边界,0 表示它们在物理上不相互接壤
+--+---------------------------------+
| | 1 2 3 4 5 6 7 8 9 10 11|
+--+---------------------------------+
|1 | 0 1 0 0 0 1 0 0 0 0 0 |
|2 | 1 0 1 0 0 0 1 1 0 0 0 |
|3 | 0 1 0 1 0 0 0 1 1 0 0 |
|4 | 0 0 1 0 1 0 0 0 1 0 0 |
|5 | 0 0 0 1 0 0 0 0 1 0 0 |
|6 | 1 0 0 0 0 0 1 0 0 1 0 |
|7 | 0 1 0 0 0 1 0 1 0 1 1 |
|8 | 0 1 1 0 0 0 1 0 1 0 1 |
|9 | 0 0 1 1 0 0 0 1 0 0 0 |
|10| 0 0 0 0 0 1 1 0 0 0 1 |
|11| 0 0 0 0 0 0 1 1 0 1 0 |
+--+---------------------------------+
基本上,邻接矩阵表示彼此相邻的大脑部分......我们想要遍历并生成这些节点的分组列表,这些节点从单个节点开始,并工作到每个可能的组合带有警告的节点,我们不希望组合彼此不物理接触.....
所以例如这样的列表将有 1,2,....11 还有 1+2 和 7+8 等 最终我们将有 2+7+8 和 6+7+8+10 因为所有这些节点都相互接触并形成一个连通分量 1-11 不允许,因为它们不共享边界,4+5+10 也不允许,因为它们不接触
这很重要的原因是我们是脑外科医生,我们删除部分图表以谋生......即大脑图表......但您永远不会删除不相邻的节点......我们正在尝试使用图表来定义我们可以在手术中走多远......所以我们需要使用 python 来生成所有可能的节点删除组合,这在现实世界中是有意义的......二进制邻接矩阵代表物理中的现实空间
一旦我有了一个节点删除的合理组合列表,我就有了一个采用不同 pandas 数据帧的代码……将节点和边归零,然后创建一个 networkx 图,我们在该图上运行效率指标…… .我只需要一种方法来确定所有可能的连续组件集,这样我们就不会运行解剖学上不合理的组合
我想解决这个问题的方法是在 networkx 中使用某种连续组件函数,但无论如何我都找不到从图中导出所有可能的连接组件组合
基本上代码会是这样的
boundary=pd.read_csv(adjacency.csv)
G=networkx.from_pandas_adjacency(boundary)
combo="something to iterate the graph g to create a list of all connected components"
for row in combo:
values = row
datasafe=pandas.read_csv("connections.csv", index_col=0)
datasafe.loc[values, :] = 0
datasafe[values] = 0
g=networkx.from_pandas_adjacency(datasafe)
h=networkx.from_pandas_adjacency(datasafe)
le=local_efficiency(g)
LE_list.append(le)
ge=global_efficiency(h)
GE_list.append(ge)
output=pandas.DataFrame(list(zip(combo, GE_list,LE_list)))
output.to_csv('multi.csv',index=None)
请注意,我们使用一个 csv 来确定列表并在不同的 CSV 上使用该列表
提前致谢...这是您正在帮助解决的一个重要问题,可以挽救生命
【问题讨论】:
-
那么,您想要一个所有直接相互连接的节点的列表吗?请提供您的数据和代码的最小示例。
-
请提供一个最小示例,即一小段数据(输入)和预期输出。也请提供您代码中的相关部分。
-
我编辑了问题以包含我们需要的示例