[英]Shapely intersection with multiple MultiPolygons where a percentage of Multipoloygons intersect?
[英]Intersection of multiple sets, which ones intersect and where?
我有大量的集合(数千个),每个集合对应一个具有ID的代理(实体)-这可以表示为字典,其中每个agent_id(键)都有一个集合(值)。
agent_path = {a1:(25,60,86,95),a2:(72,34,96,60,12,74,95,43,78),a3:....}
我需要找到不同集合的交集,更重要的是,找到哪些座席彼此相交。
a1∩a2:60、95
例如,可以将其存储在新词典中。 在下一步中,我将不得不再次遍历每个具有相交元素的代理,以执行下一个动作。
我的解决方案是在agent_path字典上循环x2并分别比较每个集合,然后将结果保存到字典中:
agent_path=dict()
agent_path['a1']=a
agent_path['a2']=b
agent_inters=dict()
for agent1 in agent_path.keys():
for agent2 in agent_path.keys():
agent_key=str(agent1)+str(agent2)
if agent1 == agent2:
pass
else:
set1=set(agent_path[agent1])
set2=set(agent_path[agent2])
set1xset2=set1.intersection(set2)
agent_inters[agent_key]=set1xset2
有没有更有效的方法可以做到这一点? 特别是,因为我将不得不对大量集合进行多次操作(这些集合在模型中的每个时间步都会更新)。
您可以使用itertools.combinations
来加快很多比较的速度,特别是没有重复时,这样(agent1∩agent2)和(agent2∩agent1)不会被比较,因为它们的结果相等。 同样,将它们放在比较之前的集合中也会加快速度。
from itertools import combinations
agent_path = {
"a1": set([25, 60, 86, 95]),
"a2": set([72, 34, 96, 60, 12, 74, 95, 43, 78]),
"a3": set([15, 23, 60, 9, 99, 95])
}
agent_inters = {}
for agent1, agent2 in combinations(agent_path, 2):
agent_key = str(agent1)+str(agent2)
agent_common = agent_path[agent1] & agent_path[agent2]
if agent_common:
agent_inters[agent_key] = agent_common
print(agent_inters) #Prints {'a1a2': {60, 95}, 'a1a3': {60, 95}, 'a2a3': {60, 95}}
如果要比较更新后的一组,则可以创建一个单独的for循环,但请保持相同的内在函数(函数def!),以确保保留str(agent1)+str(agent2)
的键顺序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.