记忆效率欧氏距离测量

时间:2018-03-30 09:26:59

标签: python scipy

我有40,000分,我需要找出每对之间的欧氏距离。通过网后,我发现计算点对之间的欧氏距离的有效方法是使用scipy.spatial distance.cdist。但是,自从没有。点数为40,000,距离matirx将占用大约12 GB的内存。

有没有办法减少存储距离矩阵所需的内存而不影响计算距离矩阵的速度?在计算距离矩阵时,数据类型是否可以更改为float 32而不是float 64?

1 个答案:

答案 0 :(得分:1)

cdist like approach

输出数据类型与输入相同。

import numpy as np
import numba as nb

@nb.njit(fastmath=True,parallel=True)
def calc_distance(vec_1,vec_2):
    res=np.empty((vec_1.shape[0],vec_2.shape[0]),dtype=vec_1.dtype)
    for i in nb.prange(vec_1.shape[0]):
        for j in range(vec_2.shape[0]):
            res[i,j]=np.sqrt((vec_1[i,0]-vec_2[j,0])**2+(vec_1[i,1]-vec_2[j,1])**2+(vec_1[i,2]-vec_2[j,2])**2)

    return res

不重复的建议

@nb.njit(fastmath=True)
def calc_distance_pairs(vec):
  res=np.empty(((vec.shape[0]**2)//2-vec.shape[0]//2),dtype=vec.dtype)

  ii=0
  for i in range(vec.shape[0]):
    for j in range(i+1,vec.shape[0]):
      res[ii]=np.sqrt((vec[i,0]-vec[j,0])**2+(vec[i,1]-vec[j,1])**2+(vec[i,2]-vec[j,2])**2)
      ii+=1

  return res

这会将内存量减少到不到scipy cdist方法的1/4。

<强>计时

calc_distance: ~2s
calc_distance_pairs: ~3s
cdist: ~11s