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]])

输出结果

原文地址:https://www.cnblogs.com/lolybj/p/14735983.html