沿3D数组轴的矢量化欧氏距离-Python
如何沿3D阵列的轴应用在2D阵列(cdist)上运行的函数 我试过使用沿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
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))