我有两个数组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自己完成。
我不关心输出的格式(列表、数组、矩阵......),最后我只想找到最小距离。
1条答案
按热度按时间dy1byipe1#
您可以使用
np.newaxis
* 扩展 * 两个数组A
和B
的维度,以启用广播,然后进行计算。成对距离意味着
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行的副本。要获得距离矩阵,可以使用
numpy.linalg.norm()
: