问题描述
我有一个功能库,每个功能都由按正确顺序排列的段 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 (将#修改为@)