沿 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))
。
如何将对 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])])
受到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))
。