我有40,000分,我需要找出每对之间的欧氏距离。通过网后,我发现计算点对之间的欧氏距离的有效方法是使用scipy.spatial distance.cdist。但是,自从没有。点数为40,000,距离matirx将占用大约12 GB的内存。
有没有办法减少存储距离矩阵所需的内存而不影响计算距离矩阵的速度?在计算距离矩阵时,数据类型是否可以更改为float 32而不是float 64?
答案 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