一个聚合器

采用类似连通域的两遍遍历法,聚合mark
使用方法:
1、初始化聚合池
2、不停往聚合池中添加两两匹配关系
3、输出聚合结果

# -- coding: utf-8 -- 
import os
import glob
import sys
import cv2
import shutil
import numpy as np
import random


class AggregatePool(object):
    def __init__(self):
        self.markid2pmarkid = {}
        self.pmarkid2markid = {}
        self.group_id = 0
        self.group_id_pairs = []

    def append(self, qmarkid, bmarkid, aggregate):
        if not aggregate:  # 不可差
            if qmarkid not in self.markid2pmarkid:
                self.markid2pmarkid[qmarkid] = self.group_id
                self.group_id += 1
            if bmarkid not in self.markid2pmarkid:
                self.markid2pmarkid[bmarkid] = self.group_id
                self.group_id += 1
        else:  # 可差
            if qmarkid in self.markid2pmarkid and bmarkid in self.markid2pmarkid:
                self.group_id_pairs.append((min(self.markid2pmarkid[qmarkid], self.markid2pmarkid[bmarkid]),
                                           max(self.markid2pmarkid[qmarkid], self.markid2pmarkid[bmarkid])))
            if qmarkid in self.markid2pmarkid and bmarkid not in self.markid2pmarkid:
                self.markid2pmarkid[bmarkid] = self.markid2pmarkid[qmarkid]
            if qmarkid not in self.markid2pmarkid and bmarkid in self.markid2pmarkid:
                self.markid2pmarkid[qmarkid] = self.markid2pmarkid[bmarkid]
            if qmarkid not in self.markid2pmarkid and bmarkid not in self.markid2pmarkid:
                self.markid2pmarkid[qmarkid] = self.group_id
                self.markid2pmarkid[bmarkid] = self.group_id
                self.group_id += 1

    def aggregate(self):
        set_list = []
        for id1, id2 in self.group_id_pairs:
            exist = False
            for s in set_list:
                if id1 in s or id2 in s:
                    s.add(id1)
                    s.add(id2)
                    exist = True
            if not exist:
                news = {id1, id2}
                set_list.append(news)

        idmap = {}
        for s in set_list:
            mins = min(s)
            for id in s:
                idmap[id] = mins

        # 刷新group-id
        for markid in self.markid2pmarkid:
            oldid = self.markid2pmarkid[markid]
            newid = idmap[oldid]
            self.markid2pmarkid[markid] = newid

        # 聚类
        for markid in self.markid2pmarkid:
            gid = self.markid2pmarkid[markid]
            if gid not in self.pmarkid2markid:
                self.pmarkid2markid[gid] = []
            self.pmarkid2markid[gid].append(markid)

        # 可视化
        for gid in self.pmarkid2markid:
            print(gid, "====================")
            for mark in self.pmarkid2markid[gid]:
                print(mark)


if __name__ == '__main__':
    all_marks = []
    # 创造100个待聚合的实例
    for i in range(100):
        singleid = random.randint(10000, 99999)
        gid = random.randint(50, 55)
        s = str(singleid)+"."+str(gid)
        all_marks.append(s)

    agg = AggregatePool()  # 初始化聚合池
    for i, qm in enumerate(all_marks):
        for j, bm in enumerate(all_marks):
            if i == j:
                continue
            else:
                if qm.split(".")[-1] == bm.split(".")[-1]:  # 判断两两是否可聚
                    agg.append(qm, bm, True)  # 添加聚合关系
                else: 
                    agg.append(qm, bm, False)  # 添加聚合关系
    agg.aggregate()  # 输出聚合结果 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值