Numpy 中某个矩阵的平方距离计算方法

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数据科学手册》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值