版权声明:未经本人许可,不得用于商业用途及传统媒体。转载请注明出处! https://blog.csdn.net/qikaihuting/article/details/82315011
#coding=utf-8
from __future__ import absolute_import,division,print_function
"""
访问字典元素的快速方式,当进行筛选性遍历访问时,即根据满足条件的索引去访问字典,建议将其转为列表,默认是
将键值存为列表元素;根据列表元素来访问对应的键值,效率高很多.
当进行顺序访问时,即采用for key,val in dic.items()即可。
"""
import os
import csv
import time
import numpy as np
import random
from collections import OrderedDict
def is_pair(angles1, angles2,threshold = 30):
# input the the list angles data
P = abs(angles1[0]-angles2[0])
Y = abs(angles1[1]-angles2[1])
R = abs(angles1[2]-angles2[2])
if P > threshold or Y > threshold or R > threshold:
return True
else:
return False
def get_pairs(All_train_list):
"""
args: all_train_data_path_list
整个字典元素个数len(dic.keys())=15677,这里选取前5000个元素进行遍历,
#完成字典的创建
"""
f = open(All_train_list,'r')
dic = OrderedDict()
for item in f.readlines()[:5000]:
name = item.split( )[0]
angles = [float(item) for item in item.split( )[-3:]]
dic[name] = angles
f.close()
#确定pair样本的策略
pair_name = set()
list_dic = list(set(dic))
#外循环索引列表
external_index = [i-1 for i in range(2,len(list_dic)) if i%4==0]
base = random.randint(1,len(list_dic)//2)
start = time.time()
step = 1
for index_1 in external_index:
step +=1
sta = time.time()
#dic.items()访问,其相当于两个步骤,先将整个字典转为列表,再取值,效率低
##key1,value1 = dic.items()[index_1]
#根据列表元素访问,直接根据键,取值。
key1,value1 = list_dic[index_1],dic[list_dic[index_1]]
# random list contain 1000 elements --内循环的索引列表
permutation = random.sample(range(base,len(list_dic)),500)
for index_2 in permutation:
##key1,value1 = dic.items()[index_2]
key2, value2 = list_dic[index_2],dic[list_dic[index_2]]
#判断是否满足pair要求,满足则存入集合pair_name中
if (((key1, key2)) in pair_name) or (((key2, key1)) in pair_name):
continue
if is_pair(value1,value2):
#print('{}---{}'.format(key1 ,key2))
pair_name.add((key1, key2))
end1 = time.time()
print("the step {} cost is {}".format(step,end1-sta))
#可以测试一下两种不同方式的时间效率,相差很大。
end = time.time()
print('the nums of pairs samples is {},costs {}'.format(len(pair_name),end-start))
if __name__=='__main__':
get_pairs('./All_Train_Lists.txt')