def pdist_toarray(a):
out=np.zeros((a.shape[0],a.shape[0]))
dists=sp.distance.pdist(a)
out[np.triu_indices(a.shape[0],1)]=dists
return out+out.T
def looping(a):
out=np.zeros((a.shape[0],a.shape[0]))
for i in xrange(a.shape[0]):
for j in xrange(a.shape[0]):
out[i,j]=np.linalg.norm(a[i]-a[j])
return out
时序:
arr=np.random.rand(1000,3)
%timeit sp.distance.pdist(arr)
100 loops, best of 3: 4.26 ms per loop
%timeit sp.distance.cdist(arr,arr)
100 loops, best of 3: 9.31 ms per loop
%timeit pdist_toarray(arr)
10 loops, best of 3: 66.2 ms per loop
%timeit looping(arr)
1 loops, best of 3: 16.7 s per loop
1 回答
要完全重现您的结果:
要在不重复计算的情况下更有效地执行此操作,并仅计算唯一对:
注意两个数组之间的关系 .
cdist
数组可以通过以下方式复制:一些有些令人惊讶的时间 -
设置:
时序:
因此,如果你想要回到正方形阵列,你应该使用
cdist
,如果你只想使用pdist
. 对于具有1000个元素的数组,循环慢约4000倍,对于具有10个元素的数组,与cdist
相比,循环慢约70倍 .