我在2D A和B中有两组点,我需要找到A中每个点的最小距离,到B中的一点.到目前为止,我一直在使用SciPy的
cdist,代码如下
import numpy as np
from scipy.spatial.distance import cdist
def ABdist(A,B):
# Distance to all points in B,for each point in A.
dist = cdist(A,B,'euclidean')
# Indexes to minimum distances.
min_dist_idx = np.argmin(dist,axis=1)
# Store only the minimum distances for each point in A,to a point in B.
min_dists = [dist[i][md_idx] for i,md_idx in enumerate(min_dist_idx)]
return min_dist_idx,min_dists
N = 10000
A = np.random.uniform(0.,5000.,(N,2))
B = np.random.uniform(0.,2))
min_dist_idx,min_dists = ABdist(A,B)
这适用于N的小值.但是现在这些集的长度从N = 10000增加到N = 35000并且我遇到了
dm = np.zeros((mA,mB),dtype=np.double)
MemoryError
我知道我可以用一个for循环替换cdist,它只保留A中每个点到B中每个点的最小距离(和索引),因为这就是我所需要的.我不需要完整的AxB距离矩阵.但我一直在使用cdist,因为它很快.
有没有办法用一个(差不多?)快的实现来替换cdist,但这不会占用那么多内存?