我正在计算两个距离并在二维数组中以0.1的间隔对它们进行合并。目前我正在这样做。然而,大量点需要很多时间将数据合并到二维数组中
import numpy as np
from scipy.spatial import distance as d
dat=np.random.rand(100,3)
dd2d=np.zeros((10,10))
while len(dat)>0:
i=len(dat)-1
while i>0:
dist0=d.euclidean(dat[0],dat[i])
dist1=d.cosine(dat[0],dat[i])
ind0=int(dist0/0.1)
ind1=int(dist1/0.1)
if ind0>9 or ind1>9:
pass
else:
dd2d[ind0,ind1]+=1
i-=1
dat=np.delete(dat,0,axis=0)
print len(dat)
这样做的最有效的方法是什么?
另外我该如何将我的代码中的while
循环转换为for
循环,以便我可以添加progressbar/tqdm来跟踪运行时间。
如果你的目标是速度,不要使用'while'循环。不要使用'for'循环。不要这样做 - “dist0/0.1” - 分割比乘法更慢。做'dist0 * 10'。你想要的是将你的循环向量化成编译C代码的东西。类似'pdist' –
我正在使用cython编写的另一个函数来计算距离。所以这部分是优化的。这里给出'scipy.spatial.distance'仅用于说明目的 –
应该仍然可以使用'pdist(dat,lambda u,v:myUFunc(u,v))'。虽然如果你的距离函数是矢量化的,你也可以做'dist0 = myUFunc(dat [i],dat [j])' –