numpy python:向量化距离函数以计算维度为 (m, 3) 的 2 个矩阵的成对距离

Ada*_*che 2 python numpy distance python-3.x

我有两个 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 ]])
Run Code Online (Sandbox Code Playgroud)

所以它包含每一行的坐标 x,y,z 一个 3D 点。B 遵循相同的格式。

我有这个功能(np 是 numpy):

def compute_dist(point1, point2):
    squared = (point1-point2)**2
    return (np.sqrt(np.sum(squares)))
Run Code Online (Sandbox Code Playgroud)

我想使用矢量化函数计算 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]])
Run Code Online (Sandbox Code Playgroud)

即使我阅读了文档,我也不明白如何使用矢量化。如何计算包含 A 和 B 之间成对距离的矩阵?我知道有scipy.distance.cdist但我想用np.vectorize自己

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

scl*_*mic 6

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

成对距离意味着 中的每个点都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)respectivley。如果然后执行像C = A-Bnumpy 自动广播这样的计算。这意味着您将获得 B 的所有 n 列的 A 的所有 m 行的副本,以及 A 的所有 m 行的 B 的所有 n 列的副本。

  A (m, 1, 3)
- B (1, n, 3)
--------------
= C (m, n, 3)
Run Code Online (Sandbox Code Playgroud)

要获得距离矩阵,您可以使用numpy.linalg.norm()

import numpy as np
m = 10
n = 12
A = np.random.random((m, 3))
B = np.random.random((n, 3))

# Add newaxis on second axis of A and on first axis on B
# shape: (m, n, 3) = (m, 1, 3) - (1, n, 3)
C = A[:, np.newaxis, :] - B[np.newaxis, :, :]

C = np.linalg.norm(C, axis=-1)
# shape: (m, n)
Run Code Online (Sandbox Code Playgroud)