N点与numpy/scipy中的参考之间的有效距离计算

D. *_*ang 20 python arrays numpy scipy

我刚开始使用scipy/numpy.我有一个100000*3阵列,每行是一个坐标,一个1*3中心点.我想计算数组中每行到中心的距离,并将它们存储在另一个数组中.最有效的方法是什么?

Jos*_*del 29

我想看看scipy.spatial.distance.cdist:

http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html

import numpy as np
import scipy

a = np.random.normal(size=(10,3))
b = np.random.normal(size=(1,3))

dist = scipy.spatial.distance.cdist(a,b) # pick the appropriate distance metric 
Run Code Online (Sandbox Code Playgroud)

dist 对于默认的远程度量,相当于:

np.sqrt(np.sum((a-b)**2,axis=1))  
Run Code Online (Sandbox Code Playgroud)

虽然cdist对于大型阵列来说效率更高(在我的机器上,因为你的尺寸问题,cdist速度提高了约35倍).


小智 6

我会使用欧几里德距离的sklearn实现.优点是使用矩阵乘法使用更有效的表达式:

dist(x, y) = sqrt(dot(x, x) - 2 * dot(x, y) + dot(y, y)
Run Code Online (Sandbox Code Playgroud)

一个简单的脚本如下所示:

import numpy as np

x = np.random.rand(1000, 3)
y = np.random.rand(1000, 3)

dist = np.sqrt(np.dot(x, x)) - (dot(x, y) + dot(x, y)) + dot(y, y)
Run Code Online (Sandbox Code Playgroud)

sklearn文档中很好地描述了这种方法的优点:http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.euclidean_distances.html#sklearn.metrics.pairwise.euclidean_distances

我正在使用这种方法来处理大型数据矩阵(10000,10000),并进行一些小修改,例如使用np.einsum函数.

  • `numpy.sqrt((X**2).sum(axis = 1)[:,None] - 2*X.dot(Y.transpose())+((Y**2).sum(axis = 1 )[无,:])` (2认同)