我是 Python 的新手,我需要实现一个聚类算法。为此,我需要计算给定输入数据之间的距离。
考虑以下输入数据 -
[[1,2,8],
[7,4,2],
[9,1,7],
[0,1,5],
[6,4,3]]
我想在这里实现的是,我想计算 [1,2,8] 与所有其他点的距离,并找到距离最小的点。
对于所有其他要点,我必须重复这一点。
我正在尝试使用 FOR 循环来实现它,但我确信 SciPy/NumPy 一定有一个函数可以帮助我有效地实现这个结果。
我在网上查看,但“pdist”命令无法完成我的工作。
有人可以指导我吗?
TIA
最佳答案
使用 np.linalg.norm
结合广播(numpy 外减法),你可以:
np.linalg.norm(a - a[:,None], axis=-1)
a[:,None]
在a
中插入一个新轴,a - a[:,None]
会做一行由广播引起的行减法。 np.linalg.norm
计算最后一个轴上的 np.sqrt(np.sum(np.square(...)))
:
a = np.array([[1,2,8],
[7,4,2],
[9,1,7],
[0,1,5],
[6,4,3]])
np.linalg.norm(a - a[:,None], axis=-1)
#array([[ 0. , 8.71779789, 8.1240384 , 3.31662479, 7.34846923],
# [ 8.71779789, 0. , 6.164414 , 8.18535277, 1.41421356],
# [ 8.1240384 , 6.164414 , 0. , 9.21954446, 5.83095189],
# [ 3.31662479, 8.18535277, 9.21954446, 0. , 7. ],
# [ 7.34846923, 1.41421356, 5.83095189, 7. , 0. ]])
元素[0,1]
, [0,2]
例如对应于:
np.sqrt(np.sum((a[0] - a[1]) ** 2))
# 8.717797887081348
np.sqrt(np.sum((a[0] - a[2]) ** 2))
# 8.1240384046359608
分别。
关于python - 计算矩阵中一个点与所有其他点之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46700326/