我的代码是区域内匹配的功能。它做的第一件事是匹配从一个区域到整个区域特征数据库的特征。
所以我有一个从查询特征索引(qfx)到数据库特征索引(ax)的映射。 数据库特征索引与区域id(rid),区域特征索引(fx),特征分数(fs)和特征等级(fk)相关联。 还有一个标记将每个映射标记为有效或无效。
问题是我想将query_feature_index-to-database_feature_index(qfx2_ax)的映射转换为region_index-to-feature_match(rid2_fm,rid2_fs和rid2_fk)的映射
我有以下代码执行此操作(为清晰起见,稍微清理一下)。左边的大小是每个步骤占用的粗略百分比。大部分时间似乎都是通过附加到默认词典中的列表来消耗掉的。
在我看来似乎没有更好的方法来做到这一点,但也许有人在那里知道我不知道的事情。也许有一个我不知道的笨拙的例行公事?
0.0 for qrid in qrid2_nns.iterkeys():
0.0 (qfx2_ax, _) = qrid2_nns[qrid]
0.0 (qfx2_fs, qfx2_valid) = qrid2_nnfilt[qrid]
0.0 nQKpts = len(qfx2_ax)
# Build feature matches
0.0 qfx2_nnax = qfx2_ax[:, 0:K]
0.4 qfx2_rid = ax2_rid[qfx2_nnax]
0.5 qfx2_fx = ax2_fx[qfx2_nnax]
0.2 qfx2_qfx = np.tile(np.arange(nQKpts), (K, 1)).T
0.1 qfx2_k = np.tile(np.arange(K), (nQKpts, 1))
# Pack valid feature matches into an interator
0.4 valid_lists = [qfx2_[qfx2_valid] for qfx2_ in (qfx2_qfx, qfx2_rid, qfx2_fx, qfx2_fs, qfx2_k,)]
0.0 match_iter = izip(*valid_lists)
0.0 rid2_fm = defaultdict(list)
0.0 rid2_fs = defaultdict(list)
0.0 rid2_fk = defaultdict(list)
# This creates the mapping I want. Can it go faster?
19.3 for qfx, rid, fx, fs, fk in match_iter:
17.2 rid2_fm[rid].append((qfx, fx))
17.0 rid2_fs[rid].append(fs)
16.2 rid2_fk[rid].append(fk)