Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从两个数据集中及时找到数据匹配时的效率_Python_Performance_Python 3.x_Time_Dataset - Fatal编程技术网

Python 从两个数据集中及时找到数据匹配时的效率

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,Ta关联时间的列表

列表中的数量B,Tb关联时间的列表

a和B的大小可能非常不同,自1970年以来,Ta/Tb中的元素已转换为小数秒


我有一个代码,它可以很好地存储数量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)