当线段有序但线段方向随机时,有效地对线段列表进行排序

问题描述

我有一个功能库,每个功能都由按正确顺序排列的段 ID 列表定义。段的节点存储在另一个文件中,但段的方向不一致。这是一个特征的数据结构示例。

feature_lib = {1: [2,3,1]}
segment_lib = {
    1: [[5,5],[3,3]],2: [[1,2],[1,0]],3: [[3,3],1],2]],4: [[1,[5,7]]
}

在上面的例子中,Segment 2和Segment 3都需要翻转以保持“2->3”的顺序,而Segment 1需要颠倒以连接到Segment 3。

我编写了执行上述任务的代码,但效率非常低,尤其是当特征数量/或段数量很大时。我遇到过有人建议使用库 NetworkX 来执行此类工作,但该建议没有太多细节,我也没有使用该软件包的经验。目前,我正在考虑将这些线段转换为线要素,并改用 Shapely。任何改进流程的帮助将不胜感激。

这是我上面例子的代码版本:

from collections import OrderedDict

nodes_summary = [] # summary list for string list of nodes for each feature
for i in feature_lib:
    list_of_seg = feature_lib[i] # get list of segments
    nodes_feat_i = [] # initalize list
    count = 0 # algorithm is dependent on the n-th segment

    for seg in list_of_segments:
        seg_nodes = segment_lib[seg] # get nodes for current segment

        # below is a scheme to rearrange the order of nodes such that segment endpoints match
        if count == 0: # no directionality enforced for first segment
            nodes_feat_i = nodes_feat_i + seg_nodes
        elif count == 1:
            if seg_nodes_prev[-1] == seg_nodes[0]: # no correction needed,directions of segments align
                nodes_feat_i = seg_nodes_prev + seg_nodes
            elif seg_nodes_prev[-1] == seg_nodes[-1]: # current segment is flipped relative to prevIoUs
                nodes_feat_i = seg_nodes_prev + seg_nodes[::-1]
            elif seg_nodes_prev[0] == seg_nodes[0]: # prevIoUs segment is flipped relative to current
                nodes_feat_i = seg_nodes_prev[::-1] + seg_nodes
            elif seg_nodes_prev[0] == seg_nodes[-1]: # both segments are in opposite direction
                nodes_feat_i = seg_nodes_prev[::-1] + seg_nodes[::-1]
        else:
            if seg_nodes_prev[-1] == seg_nodes[0]:# no correction needed,directions of segments align
                nodes_feat_i = nodes_feat_i + seg_nodes
            else: # only need flip current segment since directionality has been established by prevIoUs segments
                nodes_feat_i = nodes_feat_i + seg_nodes[::-1]

        seg_nodes_prev = seg_nodes # save nodes for current segment for use in the next step
        count += 1 # increment counter

    # remove duplicates and maintain order,append to summary list
    nodes_summary.append(list(OrderedDict.fromkeys(tuple(item) for item in nodes_feat_i)))

结果:

>>> nodes_summary
[[(1,0),(1,2),(3,1),3),(5,5)]]

编辑: 作为参考,数据集包含超过 200,000 个特征,每个特征由 2 到 50 个段定义,唯一段的数量约为 3,000,每个段包含 2-4 个节点。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)