【问题标题】:Finding euclidean difference between coordinates in numpy在numpy中找到坐标之间的欧几里得差异
【发布时间】:2018-07-15 17:58:40
【问题描述】:

我正在尝试使用以下代码使用 numpy 计算坐标之间的差异:

X = np.random.random((1000, 3))
# using broadcasting to calculate to find pairwise diffrence
diff = X.reshape(1000, 1, 3) - X
D = (diff**2).sum(2)

有人能解释一下上面两行是做什么的吗?我不明白这是如何计算坐标的欧几里德距离的。

【问题讨论】:

    标签: python numpy matrix euclidean-distance


    【解决方案1】:

    第一个计算一个随机的1000×3矩阵,所有值都在0到1之间,所以行代表3D单位立方体中的点:

    np.random.random((1000, 3))
    

    接下来我们使用reshape,构造一个1000×1×3矩阵,X.reshape(1000, 1, 3)

    现在,当我们减去重构后的矩阵时,会发生一些在 numpy 中非常流行的事情:广播。所以我们有一个1000×1×3矩阵和一个1000×1×3矩阵。这意味着我们将通过假设重复第二维 1000 次来“炸毁”第一个矩阵。所以像这样的矩阵:

    [[[x1, y1, z1]],
     [[x2, y2, z2]],
     ...
     [[xn, yn, zn]]]
    

    现在会变成:

    [[[x1, y1, z1], [x1, y1, z1], ..., [x1, y1, z1]],
     [[x2, y2, z2], [x2, y2, z2], ..., [x2, y2, z2]],
      ...         , ...              , ...          ,
     [[xn, yn, zn], [xn, yn, zn], ..., [xn, yn, zn]]]
    

    每个三元组每行重复 n 次。

    我们也炸毁了第二个矩阵,这样:

    [[x1, y1, z1],
     [x2, y2, z2],
     ...
     [xn, yn, zn]]
    

    (请注意,我们每行少了一对方括号),会爆炸到:

    [[x1, y1, z1], [x2, y2, z2], ..., [xn, yn, zn],
     [x1, y1, z1], [x2, y2, z2], ..., [xn, yn, zn],
     ...         , ...,          ..., ...         ,
     [x1, y1, z1], [x2, y2, z2], ..., [xn, yn, zn]]
    

    如果我们现在将两个矩阵相减,我们得到:

    [[[x1-x1, y1-y1, z1-z1], [x1-x2, y1-y2, z1-z2], ..., [x1-xn, y1-yn, z1-zn]],
     [[x2-x1, y2-y1, z2-z1], [x2-x2, y2-y2, z2-z2], ..., [x2-xn, y2-yn, z2-zn]],
      ...         , ...              , ...          ,
     [[xn-x1, yn-y1, zn-z1], [xn-x2, yn-y2, zn-z2], ..., [xn-xn, yn-yn, zn-zn]]]
    

    所以我们构造了一个1000×1000×3矩阵,其中第i,j个元素是一个包含点坐标差的三元组在行 i 处指定,并在行 j 处指定点的坐标。我们将该结果存储在diff

    接下来我们使用diff**2 来计算元素平方,所以现在:

    (diff**2)[i, j] == array([(xi-xj)**2, (yi-yj)**2, (zi-zj)**2])
    

    最后我们在那个矩阵上调用.sum(2)(这意味着axis=2)。这意味着我们对于(diff**2)的每一个元素都会对组件进行求和,那么:

    ((diff**2).sum())[i, j] == (xi-xj)**2 + (yi-yj)**2 + (zi-zj)**2
    

    所以我们计算一个1000×1000矩阵,其中[i, j]-th元素是欧几里得距离的平方。请注意,我们不是计算欧几里得距离,而是计算它的平方。然而,我们可以通过在结果上应用np.sqrt(..) 来计算它,所以:

    D = np.sqrt((diff**2).sum(2))  # Euclidean distance
    

    【讨论】:

    • 谢谢!这是一个非常详细的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2021-01-08
    • 2013-07-29
    • 1970-01-01
    • 2020-12-25
    • 2011-01-29
    相关资源
    最近更新 更多