使用 scipy 将最小生成树转换为索引列表?
Posted
技术标签:
【中文标题】使用 scipy 将最小生成树转换为索引列表?【英文标题】:convert minimum spanning tree to list of indices using scipy? 【发布时间】:2022-01-20 18:34:59 【问题描述】:如果我有以下输入输出图
input graph minimum spanning tree
(0) (0)
/ \ /
3 8 3
/ \ /
(3)---5---(1) (3)---5---(1)
\ / /
6 2 2
\ / /
(2) (2)
...使用 scipy.sparse.csgraph.minimum_spanning_tree 创建:
>>> from scipy.sparse import csr_matrix
>>> from scipy.sparse.csgraph import minimum_spanning_tree
>>> X = csr_matrix([[0, 8, 0, 3],
... [0, 0, 2, 5],
... [0, 0, 0, 6],
... [0, 0, 0, 0]])
>>> Tcsr = minimum_spanning_tree(X)
>>> Tcsr.toarray().astype(int)
array([[0, 0, 0, 3],
[0, 0, 2, 5],
[0, 0, 0, 0],
[0, 0, 0, 0]])
如何生成一个简单的索引列表?所以:
[0,3,1,2]
【问题讨论】:
你愿意使用networkx吗? 我理想的答案是留在 scipy 中,但为了我的生活继续前进,我会接受 networkx 我认为我们需要更多信息才能回答这个问题。如果最小生成树是一棵没有自然顺序排序的树,你想要什么输出?您是否正在寻找深度优先排序?广度优先?还有什么? 【参考方案1】:scipy.sparse.csgraph
包含按深度优先或广度优先顺序列出节点的方法:
from scipy.sparse.csgraph import breadth_first_order, depth_first_order
print(breadth_first_order(Tcsr, i_start=0, directed=False, return_predecessors=False))
# [0 3 1 2]
print(depth_first_order(Tcsr, i_start=0, directed=False, return_predecessors=False))
# [0 3 1 2]
由于您的树只有一个分支,因此这两种方法会产生相同的结果。但是对于更一般的生成树,你应该根据你感兴趣的遍历顺序来选择方法。
【讨论】:
以上是关于使用 scipy 将最小生成树转换为索引列表?的主要内容,如果未能解决你的问题,请参考以下文章