代码之家  ›  专栏  ›  技术社区  ›  Serge de Gosson de Varennes

提高分块距离计算的计算速度

  •  0
  • Serge de Gosson de Varennes  · 技术社区  · 4 年前

    我对代码的性能有一个问题,我必须计算向量之间的距离,但我认为在暴露问题之前,先考虑一下上下文。

    我在两个数据帧中存储了两组向量。我想做的是计算一个数据帧中向量集中的每个向量到另一个数据帧中的每个向量之间的距离。下面是这些数据帧的示例(我在问题的末尾以字典的形式发布了这些数据帧),这里只列出了前5行:

    df_sample = 
    
                                                                                                                                            CalVec
    1272    [0.0, 4.0, 8.0, 15.0, 10.0, 8.0, 2.54, 2.0, 4.91, 0.0, 0.0, 0.0, 0.0, 3.59, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 8.0]
    657    [1.44, 12.0, 10.0, 5.0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 8.23, 4.36, 15.0]
    806   [4.58, 13.09, 15.46, 3.59, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 0.0, 6.31]
    771      [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.0, 0.0, 2.0, 0.0, 5.59, 11.67, 3.91, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
    1370       [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 15.0, 2.89, 0.0, 0.0, 0.0, 0.0]
    df_sample.to_dict()
    

    DF = 
              id  \
    4538   A4060462000516278   
    5043   A4050494272716275   
    11663  A4070271111316245   
    2701   A4060462848716270   
    825    A4060454573516274   
    
                                                                                                                                           MeasVec  
    4538     [0.0, 0.0, 0.0, 0.0, 6.0, 15.0, 16.0, 0.0, 0.0, 5.0, 0.0, 15.0, 0.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.5, 0.0, 3.0]  
    5043   [0.0, 0.0, 0.0, 0.0, 0.0, 16.0, 12.0, 0.0, 13.0, 15.0, 0.0, 15.0, 0.0, 0.0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 3.0, 0.0]  
    11663      [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.0, 15.0, 0.0, 0.0, 0.0, 6.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]  
    2701      [0.0, 0.0, 0.0, 8.0, 13.0, 16.0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.0, 0.0, 7.0]  
    825     [0.0, 0.0, 0.0, 0.0, 0.0, 11.0, 15.0, 0.0, 13.0, 16.0, 0.0, 9.0, 3.0, 0.0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]  
    df_sample
    M = len(DF)
    

    df_sample 有1700行 DF 有12000行。我分别提供了10和50个样本。

    现在,为了计算距离(在我的全尺寸数据中),我不得不将较大的数据帧分块成较小的块,在我的实际距离计算中,我需要确保这些块的行数与 ,因此我为每个块创建空向量,直到它与 .

    M = len(DF)
    N = len(df_sample)
    P = int(round(M/N,0))-1
    
    Number_of_id = int(round(M/P,0))   #There are only unique id:s in DF
    Number_AP = 26
    
    def zerolistmaker(n):
        listofzeros = [0.0] * n
        return listofzeros
    
    def split_dataframe(df, chunk_size): 
        chunks = list()
        num_chunks = len(df) // chunk_size + 1
        for i in range(num_chunks):
            chunks.append(df[i*chunk_size:(i+1)*chunk_size])
        return chunks
    
    DF_chunked = split_dataframe(DF,Number_of_id)
    

    这里我计算距离(实际上是加权距离,所以没有交换性,即。 d(v1,v2) != d(v2,v1) ).

    import time
    t = time.process_time()
    DIST = []
    for i in range(P):
        vec = DF_chunked[i]   
        number_zero_vectors = len(vec)-len(df_sample)
        df =pd.DataFrame(columns = ['CalVec'])
        for k in range(number_zero_vectors):
            a = zerolistmaker(Number_AP)
            df = df.append({'CalVec':a},ignore_index=True)
    
        df_sample_ = pd.concat([df_sample, df])
        
        m = np.repeat(np.vstack(df_sample_['CalVec']), df_sample_.shape[0], axis=0)
        n = np.tile(np.vstack(vec['MeasVec']), (vec.shape[0], 1))
    
        d = np.count_nonzero(m, axis=1, keepdims=True)
        dist = np.sqrt(np.sum((m - n)**2/d, axis=-1))
        
        mi = pd.MultiIndex.from_product([vec['id']] * 2, names=['id2','id'])
        out = pd.DataFrame({'CalVec': m.tolist(),
                    'MeasVec': n.tolist(),
                    'distance': dist}, index=mi).reset_index()
        DIST.append(out)
    
    elapsed_time = time.process_time() - t
    
    distances = pd.concat(DIST)
    distances = distances.drop(['id2'], axis = 1)
    distances = distances.dropna()
    print(elapsed_time)
    

    这给了时间 0.0625 distance 数据框:

    id  \
    0  A4060462000516278   
    1  A4050494272716275   
    2  A4070271111316245   
    3  A4060462848716270   
    
                                                                                                                                        CalVec  \
    0  [0.0, 4.0, 8.0, 15.0, 10.0, 8.0, 2.54, 2.0, 4.91, 0.0, 0.0, 0.0, 0.0, 3.59, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 8.0]   
    1  [0.0, 4.0, 8.0, 15.0, 10.0, 8.0, 2.54, 2.0, 4.91, 0.0, 0.0, 0.0, 0.0, 3.59, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 8.0]   
    2  [0.0, 4.0, 8.0, 15.0, 10.0, 8.0, 2.54, 2.0, 4.91, 0.0, 0.0, 0.0, 0.0, 3.59, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 8.0]   
    3  [0.0, 4.0, 8.0, 15.0, 10.0, 8.0, 2.54, 2.0, 4.91, 0.0, 0.0, 0.0, 0.0, 3.59, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 8.0]   
    
                                                                                                                                       MeasVec  \
    0    [0.0, 0.0, 0.0, 0.0, 6.0, 15.0, 16.0, 0.0, 0.0, 5.0, 0.0, 15.0, 0.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.5, 0.0, 3.0]   
    1  [0.0, 0.0, 0.0, 0.0, 0.0, 16.0, 12.0, 0.0, 13.0, 15.0, 0.0, 15.0, 0.0, 0.0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 3.0, 0.0]   
    2      [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.0, 15.0, 0.0, 0.0, 0.0, 6.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]   
    3     [0.0, 0.0, 0.0, 8.0, 13.0, 16.0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.0, 0.0, 7.0]   
    
       distance  
    0      8.98  
    1     10.45  
    2      8.92  
    3      5.19  
    

    如果有任何见解,我将不胜感激。

    数据

    df_sample = {'CalVec': {1272: [0.0,
       4.0,
       8.0,
       15.0,
       10.0,
       8.0,
       2.54,
       2.0,
       4.91,
       0.0,
       0.0,
       0.0,
       0.0,
       3.59,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       2.0,
       8.0],
      657: [1.44,
       12.0,
       10.0,
       5.0,
       6.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       2.0,
       8.23,
       4.36,
       15.0],
      806: [4.58,
       13.09,
       15.46,
       3.59,
       3.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       2.0,
       0.0,
       6.31],
      771: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       4.0,
       0.0,
       2.0,
       0.0,
       5.59,
       11.67,
       3.91,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      1370: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       15.0,
       2.89,
       0.0,
       0.0,
       0.0,
       0.0],
      991: [0.0,
       0.0,
       0.0,
       0.0,
       9.0,
       1.75,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       6.5,
       14.71,
       13.0,
       9.0],
      194: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       4.0,
       15.54,
       13.0,
       2.12,
       0.0],
      1128: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       2.77,
       1.8,
       7.0,
       6.0,
       0.0,
       1.8,
       0.0,
       9.0,
       7.0,
       0.0,
       2.5,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      158: [0.0,
       0.0,
       0.0,
       0.0,
       3.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       8.0,
       15.44,
       13.0,
       2.0],
      580: [0.0,
       2.0,
       6.0,
       15.64,
       2.0,
       2.0,
       9.23,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       4.23]}}
    

    DF = {'id': {4538: 'A4060462000516278',
      5043: 'A4050494272716275',
      11663: 'A4070271111316245',
      2701: 'A4060462848716270',
      825: 'A4060454573516274',
      8679: 'A4060462010016274',
      11700: 'A4060462080916270',
      8594: 'A4060461067716272',
      8707: 'A4060454363916275',
      1071: 'A4060463723916275',
      7128: 'A4050494407616274',
      8828: 'A4060464006116272',
      8505: 'A4050500855716270',
      9958: 'A4060462054116273',
      2048: 'A4060461032216279',
      8522: 'A4050494268116274',
      10934: 'A4070270449716242',
      10128: 'A4050500604416279',
      9453: 'A4050500735216272',
      11820: 'A4060462873316274',
      7617: 'A4060461991516276',
      6930: 'A4050500905516274',
      11376: 'A4060454760216279',
      5619: 'A4139300114013544',
      35: 'A4050470904716271',
      7957: 'A4090281675416244',
      4216: 'A4050494309816277',
      6244: 'A4050494283216272',
      11922: 'A4070271196316248',
      8914: 'A4060461041916276',
      6054: 'A4060462056416278',
      12014: 'A4060464023316273',
      1362: 'A4050494275316274',
      749: 'A4620451876116275',
      4405: 'A4620451903216277',
      2021: 'A4060454386016271',
      7175: 'A4060462829816270',
      351: 'A4060454654316272',
      5853: 'A4050494877016279',
      7980: 'A4050500932116270',
      17: 'A4620451899116270',
      8234: 'A4050494361416271',
      10271: 'A4050500470516271',
      1325: 'A4050500771516275',
      2391: 'A4050500683216274',
      372: 'A4050494830916277',
      5527: 'A4050490253316276',
      5431: 'A4050500884316278',
      717: 'A4060461998716275',
      10015: 'A4050500032916279'},
     'MeasVec': {4538: [0.0,
       0.0,
       0.0,
       0.0,
       6.0,
       15.0,
       16.0,
       0.0,
       0.0,
       5.0,
       0.0,
       15.0,
       0.0,
       0.0,
       0.0,
       0.0,
       2.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       3.5,
       0.0,
       3.0],
      5043: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       16.0,
       12.0,
       0.0,
       13.0,
       15.0,
       0.0,
       15.0,
       0.0,
       0.0,
       6.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       3.0,
       3.0,
       0.0],
      11663: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       5.0,
       15.0,
       0.0,
       0.0,
       0.0,
       6.0,
       2.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      2701: [0.0,
       0.0,
       0.0,
       8.0,
       13.0,
       16.0,
       6.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       6.0,
       0.0,
       7.0],
      825: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       11.0,
       15.0,
       0.0,
       13.0,
       16.0,
       0.0,
       9.0,
       3.0,
       0.0,
       6.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      8679: [0.0,
       4.0,
       9.0,
       15.0,
       10.0,
       3.0,
       2.0,
       0.0,
       2.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       2.0,
       9.0],
      11700: [0.0,
       0.0,
       6.0,
       0.0,
       15.0,
       8.0,
       2.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       16.0,
       0.0,
       6.0],
      8594: [12.0,
       16.0,
       16.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       8.0,
       0.0,
       5.0],
      8707: [7.0,
       5.0,
       2.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       2.0,
       8.0,
       15.0],
      1071: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       12.0,
       15.5,
       6.0,
       3.5,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      7128: [0.0,
       0.0,
       0.0,
       0.0,
       10.0,
       15.0,
       16.0,
       0.0,
       8.0,
       12.0,
       0.0,
       12.0,
       0.0,
       0.0,
       4.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       3.0,
       0.0,
       11.0],
      8828: [0.0,
       0.0,
       0.0,
       0.0,
       11.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       12.0,
       15.0,
       15.0,
       7.0],
      8505: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       15.0,
       16.0,
       4.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      9958: [0.0,
       0.0,
       0.0,
       0.0,
       14.0,
       9.0,
       6.0,
       0.0,
       0.0,
       0.0,
       0.0,
       13.0,
       0.0,
       0.0,
       7.0,
       3.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       7.0,
       0.0,
       6.0],
      2048: [0.0,
       0.0,
       0.0,
       11.0,
       0.0,
       16.0,
       14.0,
       0.0,
       7.0,
       5.0,
       0.0,
       2.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      8522: [0.0,
       0.0,
       0.0,
       4.0,
       4.0,
       16.0,
       9.0,
       0.0,
       0.0,
       3.0,
       0.0,
       14.0,
       0.0,
       0.0,
       5.5,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       11.5,
       0.0,
       0.0],
      10934: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       2.0,
       8.0,
       4.5,
       0.0,
       2.0,
       0.0,
       15.0,
       5.0,
       0.0,
       2.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      10128: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       7.0,
       12.0,
       0.0,
       12.0,
       5.0,
       3.0,
       6.0,
       0.0,
       6.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      9453: [0.0,
       0.0,
       5.0,
       16.0,
       0.0,
       2.0,
       6.0,
       0.0,
       4.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      11820: [0.0,
       0.0,
       0.0,
       10.0,
       9.0,
       15.0,
       3.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      7617: [0.0,
       3.0,
       10.0,
       9.0,
       15.0,
       11.0,
       8.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       2.0,
       2.0,
       15.0],
      6930: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       2.0,
       0.0,
       0.0,
       0.0,
       10.0,
       15.5,
       14.0,
       15.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      11376: [0.0,
       0.0,
       10.0,
       7.0,
       7.0,
       11.0,
       7.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       2.0,
       16.0],
      5619: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       5.0,
       12.0,
       14.0,
       2.5,
       2.0,
       8.0],
      35: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       13.0,
       16.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      7957: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       4.5,
       0.0,
       7.0,
       7.0,
       0.0,
       2.0,
       0.0,
       15.0,
       8.0,
       4.5,
       4.5,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      4216: [16.0,
       6.0,
       2.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       3.0,
       5.0],
      6244: [11.0,
       7.0,
       2.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       5.0,
       10.0],
      11922: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       5.0,
       15.0,
       0.0,
       0.0,
       0.0,
       2.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      8914: [2.0,
       0.0,
       4.0,
       0.0,
       2.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       5.0,
       15.0],
      6054: [0.0,
       0.0,
       0.0,
       0.0,
       15.0,
       9.0,
       5.0,
       0.0,
       0.0,
       0.0,
       0.0,
       13.0,
       0.0,
       0.0,
       6.0,
       2.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       8.0,
       0.0,
       6.0],
      12014: [3.0,
       7.0,
       6.0,
       0.0,
       14.0,
       3.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       5.0,
       16.0],
      1362: [15.0,
       16.0,
       5.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       5.0,
       0.0],
      749: [14.0,
       15.0,
       16.0,
       3.0,
       3.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       6.0,
       2.0,
       12.0],
      4405: [11.0,
       16.0,
       16.0,
       3.0,
       4.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       4.0],
      2021: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       8.0,
       16.0,
       0.0,
       0.0,
       4.0,
       0.0,
       6.5,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      7175: [0.0,
       0.0,
       0.0,
       2.0,
       9.0,
       16.0,
       15.0,
       0.0,
       0.0,
       3.0,
       0.0,
       3.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       5.0,
       0.0,
       5.0],
      351: [0.0,
       0.0,
       0.0,
       0.0,
       12.0,
       16.0,
       5.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       7.0,
       0.0,
       5.0],
      5853: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       16.0,
       8.0,
       1.5,
       0.0,
       0.0,
       0.0,
       4.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      7980: [0.0,
       0.0,
       13.0,
       8.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       4.0],
      17: [11.0,
       16.0,
       16.0,
       6.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       3.0,
       11.0],
      8234: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       6.0,
       7.0,
       5.0,
       11.0,
       13.0,
       0.0,
       13.0,
       3.0,
       11.0,
       15.0,
       12.0,
       12.0,
       5.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      10271: [0.0,
       0.0,
       0.0,
       0.0,
       6.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       9.0,
       0.0,
       15.0,
       9.0,
       5.0,
       5.0],
      1325: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       3.0,
       0.0,
       0.0,
       5.0,
       0.0,
       16.0,
       0.0,
       0.0,
       9.0,
       0.0,
       5.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      2391: [0.0,
       0.0,
       3.0,
       16.0,
       0.0,
       0.0,
       0.0,
       0.0,
       2.0,
       0.0,
       0.0,
       0.0,
       0.0,
       4.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       2.0],
      372: [0.0,
       0.0,
       0.0,
       0.0,
       4.0,
       16.0,
       10.0,
       0.0,
       0.0,
       3.0,
       0.0,
       12.0,
       0.0,
       0.0,
       3.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       7.0,
       6.0,
       0.0],
      5527: [0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       5.0,
       0.0,
       2.0,
       0.0,
       0.0,
       14.0,
       16.0,
       7.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      5431: [0.0,
       0.0,
       0.0,
       0.0,
       2.0,
       3.0,
       8.0,
       0.0,
       4.0,
       7.0,
       0.0,
       16.0,
       0.0,
       0.0,
       8.0,
       2.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      717: [0.0,
       0.0,
       0.0,
       11.0,
       2.0,
       14.0,
       9.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0],
      10015: [0.0,
       0.0,
       0.0,
       7.0,
       14.0,
       16.0,
       15.0,
       0.0,
       4.0,
       9.0,
       0.0,
       11.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       0.0,
       6.0,
       3.0,
       12.0]}}
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   Serge de Gosson de Varennes    4 年前

    距离计算是一个常见问题,因此最好使用可用的函数进行计算,尤其是 sklearn . 您提供的数据不便于管理,但下面的示例可能会提供一些想法,说明如何根据数据的具体情况调整此工作流:

    import numpy as np
    import pandas as pd
    from sklearn.metrics import pairwise_distances
    
    X = pd.DataFrame(np.random.rand(10, 30))
    Y = pd.DataFrame(np.random.rand(20, 30))
    
    
    def custom_distance(x, y):
        """Sample asymmetric function."""
        return max(x) + min(y)
    
    # use n_jobs=-1 to run calculations with all cores
    result = pairwise_distances(X, Y, metric=custom_distance, n_jobs=-1)
    

    要完成@SultanOrazbayev:

    from sklearn.metrics import pairwise_distances
    
    
    Ax = df_sample['CalVec'] = df_sample['CalVec'].apply(lambda x: np.array(x))
    Bx = DF['MeasVec'] = DF['MeasVec'].apply(lambda x: np.array(x))
    
    A = Ax.to_numpy()
    B = Bx.to_numpy()
    AA = np.stack(A)
    BB = np.stack(B)
    
    result = pairwise_distances(AA, BB, metric=custom_distance, n_jobs=-1)
     
    

    在3分钟内完成。