相关疑难解决方法(0)

如何用NumPy计算欧氏距离?

我在3D中有两点:

(xa, ya, za)
(xb, yb, zb)
Run Code Online (Sandbox Code Playgroud)

我想计算距离:

dist = sqrt((xa-xb)^2 + (ya-yb)^2 + (za-zb)^2)
Run Code Online (Sandbox Code Playgroud)

使用NumPy或Python的最佳方法是什么?我有:

a = numpy.array((xa ,ya, za))
b = numpy.array((xb, yb, zb))
Run Code Online (Sandbox Code Playgroud)

python numpy euclidean-distance

466
推荐指数
15
解决办法
65万
查看次数

用Numpy和Cython加速距离矩阵计算

考虑一个维数NxM的numpy数组A. 目标是计算欧几里德距离矩阵D,其中每个元素D [i,j]是行i和j之间的核心距离.这样做的最快方法是什么?这不是我需要解决的问题,但它是我正在尝试做的一个很好的例子(通常,可以使用其他距离度量).

这是迄今为止我能想到的最快的:

n = A.shape[0]
D = np.empty((n,n))
for i in range(n):
    D[i] = np.sqrt(np.square(A-A[i]).sum(1))
Run Code Online (Sandbox Code Playgroud)

但这是最快的方式吗?我主要关注for循环.我们可以用Cython打败这个吗?

为了避免循环,我尝试使用广播,并执行以下操作:

D = np.sqrt(np.square(A[np.newaxis,:,:]-A[:,np.newaxis,:]).sum(2))
Run Code Online (Sandbox Code Playgroud)

但事实证明这是一个坏主意,因为构建维度NxNxM的中间3D阵列会产生一些开销,因此性能更差.

我试过Cython.但我是Cython的新手,所以我不知道我的尝试有多好:

def dist(np.ndarray[np.int32_t, ndim=2] A):
    cdef int n = A.shape[0]    
    cdef np.ndarray[np.float64_t, ndim=2] dm = np.empty((n,n), dtype=np.float64)      
    cdef int i = 0    
    for i in range(n):  
        dm[i] = np.sqrt(np.square(A-A[i]).sum(1)).astype(np.float64)              
    return dm 
Run Code Online (Sandbox Code Playgroud)

上面的代码比Python的for循环慢一点.我对Cython知之甚少,但我认为我可以达到至少与for loop + numpy相同的性能.我想知道在正确的方式下是否有可能实现一些显着的性能提升?或者是否还有其他方法可以加快速度(不涉及并行计算)?

python optimization performance numpy cython

6
推荐指数
1
解决办法
2371
查看次数