沿3D数组轴的矢量化欧氏距离-Python

沿3D数组轴的矢量化欧氏距离-Python,python,numpy,scipy,vectorization,Python,Numpy,Scipy,Vectorization,如何沿3D阵列的轴应用在2D阵列(cdist)上运行的函数 我试过使用numpy。沿_轴应用_,但我需要在2D数组上操作,而不是1D。我通过沿一个轴迭代获得了所需的结果,但如果可能的话,我更希望将其矢量化: from scipy import spatial import numpy as np a = np.random.randn(600).reshape(10, 20, 3) distances = np.array([spatial.distance.cdist(a[i,:,:], a

如何沿3D阵列的轴应用在2D阵列(cdist)上运行的函数

我试过使用
numpy。沿_轴应用_
,但我需要在2D数组上操作,而不是1D。我通过沿一个轴迭代获得了所需的结果,但如果可能的话,我更希望将其矢量化:

from scipy import spatial
import numpy as np

a = np.random.randn(600).reshape(10, 20, 3)
distances = np.array([spatial.distance.cdist(a[i,:,:], a[i,:,:]) for i in range(a.shape[0])])

受此启发,我们可以以矢量化的方式解决它。因此,遵循from包(免责声明:我是它的作者),我们可以利用
矩阵乘法
和一些类似的方法-

a_s = np.einsum('ijk,ijk->ij',a,a)
sq_dists = a_s[...,None]+a_s[...,None,:]-2*np.einsum('ijk,ilk->ijl',a,a)
dists = np.sqrt(sq_dists)
备选方案:

  • 我们可以在Python3.x上使用
    np.matmul/@-运算符来替换矩阵乘法部分。因此,
    np.einsum('ijk,ilk->ijl',a,a)
    可以替换为
    np.matmul(a,a.transpose(0,2,1))

是否有10x20点的坐标系?现在你想计算这些点在N=20维上的距离吗?是的,你被遇见了,迪瓦卡的答案符合你的目的!成功了,非常感谢!我自己从来没有猜到过。