麻木Python:向量化距离函数计算(m,3)维2矩阵两两距离

igetnqfo  于 2022-11-19  发布在  Python
关注(0)|答案(1)|浏览(126)

我有两个数组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 ]])

因此,它包含每一行的三维点的坐标x,y,z。B遵循相同的格式。
我有这个函数(np是numpy):

def compute_dist(point1, point2):
    squared = (point1-point2)**2
    return (np.sqrt(np.sum(squares)))

我想用一个向量化函数来计算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]])

即使我读了文档,我也不明白如何使用矢量化。我如何计算包含A和B之间的成对距离的矩阵?我知道有scipy.distance.cdist,但我想使用np.vectorize自己完成。
我不关心输出的格式(列表、数组、矩阵......),最后我只想找到最小距离。

dy1byipe

dy1byipe1#

您可以使用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)。如果你执行一个类似C = A-B的计算,numpy会自动广播,这意味着你会得到A的所有m行对应B的所有n列的副本,以及B的所有n列对应A的所有m行的副本。

A (m, 1, 3)
- B (1, n, 3)
--------------
= C (m, n, 3)

要获得距离矩阵,可以使用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
C = A[:, np.newaxis, :] - B[np.newaxis, :, :]
# shape: (m, n, 3) = (m, 1, 3) - (1, n, 3)

C = np.linalg.norm(C, axis=-1)
# shape: (m, n)

相关问题