首页 > 其他分享 >Numpy 的广播机制高效计算矩阵之间两两距离

Numpy 的广播机制高效计算矩阵之间两两距离

时间:2022-09-04 16:35:10浏览次数:84  
标签:10 dist cloud2 cloud1 矩阵 广播 L2 np Numpy

利用numpy可以很方便的计算两个二维数组之间的距离。二维数组之间的距离定义为:X的维度为(m, c),Y的维度为(m,c),Z为X到Y的距离数组,维度为(m,n)。且Z[0,0]是X[0]到Y[0]的距离。Z(a,b)为X[a]到Y[b]的距离。

例如: 计算 m*2 的矩阵 与  n * 2 的矩阵中,m*2 的每一行到  n*2 的两两之间欧氏距离。

'''
L2 = sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2)
'''

import numpy as np

# ============= 方法一:不用循环 ====================
def L2_dist_1(cloud1, cloud2):
    m, n = len(cloud1), len(cloud2)
    cloud1 = np.repeat(cloud1, n, axis=0)
    cloud1 = np.reshape(cloud1, (m, n, -1))
    dist = np.sqrt(np.sum((cloud1 - cloud2)**2, axis=2))
    return dist


# ============= 方法二:用一重循环 ==================
def L2_dist_2(cloud1, cloud2):
    m, n = len(cloud1), len(cloud2)
    dist = np.zeros((m, n), dtype=np.float)
    for i in range(m):
        dist[i, :] = np.sqrt(np.sum((cloud1[i, :] - cloud2)**2, axis=1)) 
    return dist


# ============= 方法二:用两重循环 ==================
def L2_dist_3(cloud1, cloud2):
    m, n = len(cloud1), len(cloud2)
    dist = np.zeros((m, n), dtype=np.float)
    for i in range(m):
        for j in range(n):
            dist[i, j] = np.sqrt(np.sum((cloud1[i, :] - cloud2[j, :])**2, axis=0)) 
    return dist


if __name__ == '__main__':
    a = np.array([[ 0, 0, 0],
                  [10,10,10],
                  [20,20,20],
                  [30,30,30]])

    b = np.array([[ 0, 0, 0],
                  [10,10,10]])

    print('不用循环:\n', L2_dist_1(a, b))
    print('用一重循环:\n', L2_dist_2(a, b))
    print('用两重循环:\n', L2_dist_3(a, b))

程序运行结果:

 

参考:Numpy 的广播机制高效计算矩阵之间两两距离

 

标签:10,dist,cloud2,cloud1,矩阵,广播,L2,np,Numpy
From: https://www.cnblogs.com/picassooo/p/16655346.html

相关文章

  • numpy数组扩展函数repeat和tile用法
    numpy数组扩展函数repeat和tile用法【Python学习】Numpy函数repeat和tile用法 ......
  • numpy reshape
    把一维数组reshape成多维数组,是由外向内逐步切割的过程: 输出: ......
  • leetcode-1582. 二进制矩阵中的特殊位置
    1582.二进制矩阵中的特殊位置图床:blogimg/刷题记录/leetcode/1582/刷题代码汇总:https://www.cnblogs.com/geaming/p/16428234.html题目思路先对每行进行遍历,如果这......
  • 1582. 二进制矩阵中的特殊位置
    1582.二进制矩阵中的特殊位置给你一个大小为rowsxcols的矩阵mat,其中mat[i][j]是0或1,请返回矩阵 mat中特殊位置的数目。特殊位置定义:如果mat[i][j]=......
  • 混淆矩阵
    prediction1prediction0label1TPFNlabel0FPTN......
  • P1005 [NOIP2007 提高组] 矩阵取数游戏 题解
    luogu原题传送门[NOIP2007提高组]矩阵取数游戏题目描述帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的\(n\timesm\)的矩阵,矩阵中的每个元素\(a_{i,j}\)均为非......
  • 螺旋矩阵 II
    螺旋矩阵II给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的nxn正方形矩阵matrix。示例1:输入:n=3输出:[[1,2,3],[8,9,4],[7,6,5]......
  • 矩阵运算常用性质
    以下内容是把这里的结论整理了一下。矩阵乘法已知\(\mathbf{C}=\mathbf{A}\mathbf{B}\),则:\[\mathbf{C}^T=\mathbf{B}^T\mathbf{A}^T\]已知\(\mathbf{C}=\mathbf{......
  • python numpy.stack()
    numpy.stack()这个函数的功能就是堆叠array,就是对矩阵升维。但是比较头疼的就是stack()中的axis的理解。我找到了一篇比较好的博客,直接转载到这里了numpy.stack最通俗......
  • 算法 - 螺旋矩阵 II
    59.螺旋矩阵II这道题困扰了我很久,一些边界值控制比较繁琐,但是偶然发现按照以下方法写,在Leetcode可以AC。classSolution{publicstaticint[][]generateMatrix(......