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
要准确再现结果:
要在不重复计算且只计算唯一对的情况下更有效地执行此操作:
^{pr2}$注意两个数组之间的关系。
cdist
数组可以通过以下方式复制:有些令人惊讶的时间安排-
设置:
时间安排:
因此,如果你想要回平方数组,你应该使用
cdist
,如果你只想让对使用pdist
。与cdist
相比,具有1000个元素的数组的循环速度要慢~4000x,对于有10个元素的数组,循环速度要慢~70x。在相关问题 更多 >
编程相关推荐