Numpy 中某个矩阵的平方距离计算方法
目录
具体流程
1.假设:有一个n*m的矩阵,其内部为n个m维点的坐标:
rand = np.random.RandomState(42)
x = rand.randint(0, 10, (3, 2))
x
Out[332]:
array([[6, 3],
[7, 4],
[6, 9]])
2.计算在坐标系中每对点的差值
difference = x[:, None, :] - x[None, :, :]
difference.shape
Out[334]: (3, 3, 2)
difference
Out[335]:
array([[[ 0, 0],
[-1, -1],
[ 0, -6]],
[[ 1, 1],
[ 0, 0],
[ 1, -5]],
[[ 0, 6],
[-1, 5],
[ 0, 0]]])
3.计算出差值的平方
sq_ = difference ** 2
sq_.shape
Out[337]: (3, 3, 2)
sq_
Out[338]:
array([[[ 0, 0],
[ 1, 1],
[ 0, 36]],
[[ 1, 1],
[ 0, 0],
[ 1, 25]],
[[ 0, 36],
[ 1, 25],
[ 0, 0]]], dtype=int32)
4.将差值求和得平方距离
dist = sq_.sum(-1)
dist
Out[341]:
array([[ 0, 2, 36],
[ 2, 0, 26],
[36, 26, 0]], dtype=int32)
分析
从二维到三维的变化过程:
添加一个**np.newaxis**(等同于**None**)
**其实就是在对应的shape位置上加上一个*1***
如以下代码所示
x1 = x[:, None, :]
x2 = x[None, :, :]
x1.shape
Out[344]: (3, 1, 2)
x2.shape
Out[345]: (1, 3, 2)
那么对于这两个shape (3, 1, 2) 和 (1, 3, 2)而言
由numpy的广播原则最后两个shape 都会变成(3, 3, 2)
可以这样理解:
认为现在是一个三维的坐标图
对于(3, 1, 2)而言,所有的值都在 xoz 平面上分布
对于(1, 3, 2)而言,所有的值都在 yoz 平面上分布
那么广播后:
xoz 平面上的点会沿着y轴向前复制三个相同的平面
yoz 平面上的点也会沿着x轴向前复制三个
那么必然在第一象限内两平面产生的这样两个3*3*2的空间会有交点
前述代码中第一步的减法即是在这些交点处执行了
平方无需多言
接下来是求和:
之前扩大维数的时候将点分别置于了两个侧平面
其中x, y轴均是表示点的个数
而z轴表示的是实际每个点的x,y坐标信息
那么不难理解:
将z轴累加降维就可以得到两个点横纵坐标的平方和
最终得到的结果矩阵:
axis 0 和 axis 1 表示的都是每个点
交点处即为两点距离的平方
参考
《Python数据科学手册》