zoukankan      html  css  js  c++  java
  • python求向量集合中两两向量对应的欧式距离

    python求向量集合中两两向量对应的欧式距离

    为了使用矩阵加速运算,因此向量集合转换成矩阵的形式,如n×m的矩阵,n为向量的个数,m为向量的维度。

    方法1

    def f(mat):
        """
    
        :param mat: 矩阵n*m
        :return: n个向量间两两之间对应的长度,共n*(n-1)/2个
        """
        result = np.array([])
        for i in range(mat.shape[0]-1):
            result = np.concatenate((result,np.sqrt(np.sum((mat[i]-mat[i+1:])**2,axis=1))))
        return result
    

    依次取集合中的每个向量,计算与其他向量组成的矩阵的距离

    np.sqrt(np.sum((mat[i]-mat[i+1:])**2,axis=1))
    

    测试用例

    mat = np.array([[1,2,3],[2,3,4],[0,4,2],[5,3,2]])
    

    输出结果

    不过仍存在for循环,所以还得进一步优化

    方法2

    def f(mat):
        """
        计算矩阵每个向量与其他向量的欧式距离
        :param mat: n*m的矩阵,表示n个m维向量
        :return: n*n的返回结果,对应位置值为第i与第j个向量的欧式距离(去除重复应返回n*(n-1)/2个结果)
        """
        mat1 = np.expand_dims(mat, 1)
        mat2 = np.expand_dims(mat, 0)
        return np.sqrt(np.sum((mat1 - mat2) ** 2, axis=-1))
    

    完全通过矩阵运算,速度会更快.

    原理通过矩阵运算自动复制维度元素,当然也可以通过如下手动指定复制元素,结果相同。

    可以推导下,就是在计算向量间对应元素相减的平方和,在开根号

    mat1 = np.expand_dims(mat, 1).repeat(mat.shape[0],1)
    mat2 = np.expand_dims(mat, 0).repeat(mat.shape[0],0)
    

    测试用例

     mat = np.array([[1,2,3],[2,3,4],[0,4,2],[5,3,2]])
    

    输出结果

  • 相关阅读:
    函数间的调用关系
    二分法原理
    图片1
    C函数讲解
    图片2
    图片1
    图片2
    函数间的调用关系
    C函数讲解
    二分法原理
  • 原文地址:https://www.cnblogs.com/lolybj/p/14735983.html
Copyright © 2011-2022 走看看