如何在元组列表中对相交的形状几何对象进行分组

2024-04-19 11:33:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一份数据清单如下:

from shapely.geometry import box

data = [box(1,2,3,4), box(5,6,7,8), box(1,2,3,4)]
codes = ['A','B','C']

列表“data”包含以下元素

^{pr2}$

我要检查一个元素是否与其他元素相交。如果相交,则应放入一个元组;如果不相交,则应放入不同的元组中。预期结果是:

result = [(A,C), (B)]

怎么做?在

我试了一下:

results = []
for p,c in zip(data,codes):
    for x in data:
        if p.intersects(x): ##.intersects return true if they overlap else false
            results.append(c)
print results

Tags: 数据infromimportbox元素fordata
3条回答
from shapely.geometry import box

data = [box(1,2,3,4), box(5,6,7,8), box(1,2,3,4)]
codes = ['A','B','C']

创建字典以将代码映射到方框:

^{pr2}$

检查所有组合:

intersecting = set()

for i, a in enumerate(codes, 1):
    for b in codes[i:]:
        if d[a].intersection(d[b]):
            intersecting |= {a, b}

print(tuple(intersecting), tuple(set(codes)^intersecting))
# ('C', 'A') ('B',)

元组将是无序的,因为使用了集合。在

对于数据中的每个值,将具有相交值的所有元素组成一个元组。如果列表不在列表中,请将其添加到结果列表中。在

results=[]
for b in data
    same_b = tuple([d for d in data if d.intersects(b)])
    if not same_b in results:
        results.append(same_b)

结果是一个元组列表,每个元组都有相同值的所有元素,即相交元素。在

如果元素已经被提取到results中,则可以通过不生成元组来提高效率。在

注意,对于给定的数据集,与==相等而不是相交。在

如果需要代码而不是数据,请使用字典而不是变量名。codes={'A':box(...),..}

保留映射到a、B和C的对象的dict,这是一组匹配的对象,如果没有匹配的元素不在匹配的集合中,则只添加没有匹配的元素,因为所有可能的组合都将被测试:

from shapely.geometry import box
from itertools import combinations

codes = ["A", "B", "C"]
d = dict(zip(codes, data))
prev = codes[0]
matched, out = set(), []
for p1, p2 in combinations(codes, 2):
    if d[p1].intersects(d[p2]):
        out.append((p1, p2))
        matched.update([p1, p2])
    # when p1 is a new letter, we have tried all combs for that prev
    # if prev is not in matched it did not intersect any other so
   # add it as a single tuple and add to matched to avoid dupes
    elif p1 != prev and prev not in matched:
        out.append(tuple(prev,))
        matched.add(prev)
    prev = p1
# catch the last letter
if p2 not in matched:
    out.append(tuple(p2,))
print(out)
[('A', 'C'), ('B',)]

相关问题 更多 >