我在Python中遇到以下问题需要解决:
给定两个坐标矩阵(NumPy ndarrays)A
和B
,在a
中找到A
中所有坐标向量b
的{{1}} { {1}},使欧几里德距离B
最小化。坐标矩阵||a-b||
和A
可以有不同数量的坐标向量(即不同的行数)。
此方法应返回坐标向量B
矩阵,其中C
中的第i个向量c
是来自C
的向量,它使用欧洲坐标最小化欧几里德距离B
中的向量a
。
例如,假设
A
和A = np.array([[1,1], [3,4]])
B = np.array([[1,2], [3,6], [8,1]])
中的向量[1,1]
与A
中的向量之间的欧几里德距离为:
B
因此1, 5.385165, 7
中的第一个向量为C
类似地,[1,2]
中的向量[3,4]
和A
中的向量的距离为:
B
因此2.828427, 2, 5.830952
中的第二个和最后一个向量为C
所以[3,6]
如何在Python中高效编码?
答案 0 :(得分:4)
您可以使用scipy.spatial.distance
中的cdist
来有效获取欧几里德距离,然后使用np.argmin
获取与最小值对应的索引,并使用这些索引编入B
为了最终的输出。这是实施 -
import numpy as np
from scipy.spatial.distance import cdist
C = B[np.argmin(cdist(A,B),1)]
示例运行 -
In [99]: A
Out[99]:
array([[1, 1],
[3, 4]])
In [100]: B
Out[100]:
array([[1, 2],
[3, 6],
[8, 1]])
In [101]: B[np.argmin(cdist(A,B),1)]
Out[101]:
array([[1, 2],
[3, 6]])