Python 从两个数据集中及时找到数据匹配时的效率
列表中的数量A,Ta关联时间的列表 列表中的数量B,Tb关联时间的列表 a和B的大小可能非常不同,自1970年以来,Ta/Tb中的元素已转换为小数秒Python 从两个数据集中及时找到数据匹配时的效率,python,performance,python-3.x,time,dataset,Python,Performance,Python 3.x,Time,Dataset,列表中的数量A,Ta关联时间的列表 列表中的数量B,Tb关联时间的列表 a和B的大小可能非常不同,自1970年以来,Ta/Tb中的元素已转换为小数秒 我有一个代码,它可以很好地存储数量a至少在数量B的1小时内的索引,并增加时间间隔,如果匹配的数量不是一个具体的提示,但听起来你应该尝试一下numpy,它可能会帮助你加快速度:事实上,我已经在使用它,我正在使用netCDF4从netCDF文件中提取我的A和B,这将为您提供numpy.arrays对象,但由于它们具有不同的结构,而且我很懒,A数据的形状
我有一个代码,它可以很好地存储数量a至少在数量B的1小时内的索引,并增加时间间隔,如果匹配的数量不是一个具体的提示,但听起来你应该尝试一下numpy,它可能会帮助你加快速度:事实上,我已经在使用它,我正在使用netCDF4从netCDF文件中提取我的A和B,这将为您提供numpy.arrays对象,但由于它们具有不同的结构,而且我很懒,A数据的形状为N、M、1、1,B数据的形状为L,P所以我刚刚传输了列表A和B中的所有内容。numpy.array的循环速度比列表快吗?在numpy数组上循环可能比在列表上循环慢,但对于大多数操作,您不需要手动循环。我不能百分之百肯定我理解您的代码在做什么,但我认为您可以通过使用scipy.spatial函数获得相同的结果。可能:如果代码/解释不清楚,请道歉。我想比较列表A和列表B中两个相同的物理量,它们没有在列表Ta和列表Tb的同一时间进行测量,因此我选择了列表A中的测量指标,这些指标对应于列表B中在测量A后1小时内发生的测量值。但for循环用于获得时间差,然后是if语句,它检查差异是否小于一个小时,这需要很长时间,我很想知道这是否是最有效的方法,假设你按时间排序,你可以进行二进制搜索,所以你只需要搜索特定的子集。
a=0
it=1
#I want at least 50 match
while(a<50):
differences=range(len(Ta))
#those are the indices of the times in Ta[] which are used for comparison
A_idx=[-1]*len(Tb)
A_idx1=[-1]*len(Tb)
for i in range(0,len(Tb)):
for j in range(0,len(Ta)):
differences[j]=fabs(Tb[i]-Ta[j])
val,idx=min((val,idx) for (idx,val) in enumerate(differences))
# <it means the closest Ta within it hours.
if val/3600<it:
A_idx[i]=idx
A_idx1[i]=idx
a=len(A_idx)-A_idx.count(-1)
if a<50:
it=it+1
#those are the indices of the times in Tb[] which are used for comparison
B_idx=[i for i in range(len(A_idx)) if A_idx[i]!=-1]
#get rid of the useless values in A_idx1
A_idx1[:]=(value for value in A_idx1 if value!=-1)