【发布时间】:2017-08-03 06:44:42
【问题描述】:
我正在计算两个距离,并在二维数组中以 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 循环,以便我可以添加进度条/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])
标签: python arrays numpy binning