沿 3D 阵列轴的矢量化欧氏距离 - Python

Vectorized euclidean distance along an axis of a 3D array - Python

如何将对 2D 数组 (cdist) 进行运算的函数沿 3D 数组的轴应用?

我试过 numpy.apply_along_axis ,但我需要对二维数组进行操作,而不是一维数组。我通过沿一个轴迭代获得了我需要的结果,但如果可能的话我更喜欢它矢量化:

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])])

受到, we can solve it in a vectorized manner. So, following the wiki contents from eucl_dist package (disclaimer: I am its author), we could leverage matrix-multiplication and some NumPy specific implementations的启发,像这样-

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)

备选方案:

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