numpython:向量化距离函数,用于计算2矩阵的两两距离(m,3)

numpython:向量化距离函数,用于计算2矩阵的两两距离(m,3),python,python-3.x,numpy,distance,Python,Python 3.x,Numpy,Distance,我有两个numpy数组A和B。A的形状是(m,3),B的形状是(n,3) 这些矩阵如下所示: A #output array([[ 9.227, -4.698, -95.607], [ 10.294, -4.659, -94.606], [ 11.184, -5.906, -94.675], ..., [ 19.538, -91.572, -45.361], [ 20.001, -92.655, -45.009], [ 19.271, -92.726,

我有两个numpy数组A和B。A的形状是(m,3),B的形状是(n,3)

这些矩阵如下所示:

A
#output
array([[  9.227,  -4.698, -95.607],
   [ 10.294,  -4.659, -94.606],
   [ 11.184,  -5.906, -94.675],
   ...,
   [ 19.538, -91.572, -45.361],
   [ 20.001, -92.655, -45.009],
   [ 19.271, -92.726, -45.79 ]])
因此,它包含每一行的坐标x,y,z的三维点。B采用相同的格式

我有这个函数(np是numpy):

我想用一个向量化函数来计算a和B之间的成对距离

我试试这个:

 v = np.vectorize(compute_dist)
 v(A, B)
 #output
 matrix([[37.442, 42.693, 72.705],
    [37.442, 42.693, 72.705],
    [37.442, 42.693, 72.705],
    ...,
    [37.442, 42.693, 72.705],
    [37.442, 42.693, 72.705],
    [37.442, 42.693, 72.705]])
即使我读了文件,我也不知道如何使用矢量化。如何计算包含a和B之间成对距离的矩阵?我知道有scipy.distance.cdist但是我想自己用np.vectorize来做


我不关心输出的格式(列表、数组、矩阵…)。最后,我只想找到最小距离

您可以使用
np.newaxis
扩展两个数组
A
B
的维度,以启用广播,然后进行计算

成对距离意味着应将
A(m,3)
中的每个点与
B(n,3)
中的每个点进行比较。这将导致距离矩阵
(m,n)
。 有了numpy,人们可以使用广播来实现想要的结果。 通过使用
A=A[:,np.newaxis,:]
B=B[np.newaxis,:,:]
生成的 形状分别是
A(m,1,3)
B(1,n,3)
。 如果随后自动执行类似于
C=a-B
numpy的计算 广播。这意味着您可以为B的所有n列获取a的所有m行的副本 以及a的所有m行的B的所有n列的副本

A(m,1,3)
-B(1,n,3)
--------------
=C(m,n,3)
要获得距离矩阵,可以使用
numpy.linalg.norm()

将numpy导入为np
m=10
n=12
A=np.随机.随机((m,3))
B=np.随机.随机((n,3))
#在A的第二轴和B的第一轴上添加新轴
#形状:(m,n,3)=(m,1,3)-(1,n,3)
C=A[:,np.newaxis,:]-B[np.newaxis,:,:]
C=np.linalg.norm(C,轴=-1)
#形状:(m,n)

我不明白这对我有什么帮助。我想我错过了一些东西。你能解释一下我的想法吗?这不是一个使用
np.vectorize
的解决方案,而是
广播
。看一眼报纸可能会对你有所帮助。@Adam。这是合理的解释。你需要坐下来,一行一行地走过台阶。玩每一个操作直到你理解它。开始时这是一个痛苦的过程,但如果你想学习,这是绝对必要的。最后你需要一个
(n,m)
矩阵,其中
元素(i,j)
代表a的点i和B的点j之间的标量距离。作为中间结果,你有一个数组
(m,n,3)
其中
元素(i,j,:)
表示A的点i和B的点j之间的距离
向量
。@AdamBellaïche我答案中的最后一行
np.linalg.norm(C,轴=-1)
就是这样做的。如果你想自己计算,那没问题,但是你可以使用
np.sum((A-B)**2,axis=2)来代替
apply\u over\u axis
。(记住python使用的是基于零的索引
)Vectorize并不是你想象的那样。你期望什么样的产出?MxN矩阵?@MadPhysician我不希望有任何特定的输出。通常的形式当然是矩阵。但在我的代码中,我试图得到所有距离的列表,我不一定指输出中的数字。我希望得到一个length=m*nIf的列表,你指的是数组(在python中它们是不同的),然后你应该投票并接受发布的答案。这几乎是一种规范的方式,也是对广播的一个很好的介绍。
 v = np.vectorize(compute_dist)
 v(A, B)
 #output
 matrix([[37.442, 42.693, 72.705],
    [37.442, 42.693, 72.705],
    [37.442, 42.693, 72.705],
    ...,
    [37.442, 42.693, 72.705],
    [37.442, 42.693, 72.705],
    [37.442, 42.693, 72.705]])