python计算两个点之间的距离_计算python中每个点之间距离
的最快⽅法
在我的项⽬中,我需要计算存储在数组中的每个点之间的欧⼏⾥德距离.
⼊⼝数组是2D numpy数组,其中3列是坐标(x,y,z),每⾏定义⼀个新点.
我通常在我的测试⽤例中使⽤5000 – 6000点.
我的第⼀个算法使⽤Cython和我的第⼆个numpy.我发现我的numpy算法⽐cython快.
编辑:6000分:
numpy 1.76 s / cython 4.36 s
这是我的cython代码:
cimport cython
from libc.math cimport sqrt
@cython.boundscheck(False)
@cython.wraparound(False)
cdef void calcul1(double[::1] M,double[::1] R):
cdef int i=0
cdef int max = M.shape[0]
cdef int x,y
cdef int start = 1
for x in range(0,max,3):
for y in range(start,max,3):
R[i]= sqrt((M[y] - M[x])**2 + (M[y+1] - M[x+1])**2 + (M[y+2] - M[x+2])**2)
i+=1
start += 1
python 定义数组M是初始⼊⼝数组的内存视图,但在调⽤函数calcul1()之前通过numpy展平(),R是⽤于存储所有结果的1D输出数组的内存视图.
这是我的Numpy代码:
def calcul2(M):
return np.sqrt(((M[:,:,np.newaxis] - M[:,np.newaxis,:])**2).sum(axis=0))
这⾥M是初始⼊⼝数组,但在函数调⽤之前通过numpy transpose()将坐标(x,y,z)作为⾏,将点作为列.
此外,这个numpy函数⾮常⽅便,因为它返回的数组组织得很好.它是⼀个n×n数组,n为点数,每个点有⼀⾏和⼀列.因此,例如距离AB存储在⾏A 和列B的交叉点索引处.
这是我如何称呼它们(cython函数):
cpdef test():
cdef double[::1] Mf
cdef double[::1] out = np.empty(17998000,dtype=np.float64) # (6000² - 6000) / 2
M = np.arange(6000*3,dtype=np.float64).reshape(6000,3) # Example array with 6000 points Mf = M.flatten() #because my cython algorithm need a 1D array
Mt = M.transpose() # because my numpy algorithm need coordinates as rows
calcul2(Mt)
calcul1(Mf,out)
我在这⾥做错了吗?对于我的项⽬,两者都不够快.
1:有没有办法改进我的cython代码以击败numpy的速度?
2:有没有办法改进我的numpy代码以便更快地计算?
3:或者任何其他解决⽅案,但它必须是python / cython(如并⾏计算)?
谢谢.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。