Mud*_*its 3 python numpy euclidean-distance
我试图使用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)
Run Code Online (Sandbox Code Playgroud)
有人能解释一下上面两行是做什么的吗?我不明白这是如何计算坐标的欧氏距离的.
第一个计算随机1000×3矩阵,所有值都在0和1之间,因此行表示3D单位立方体中的点:
np.random.random((1000, 3))
Run Code Online (Sandbox Code Playgroud)
接下来我们使用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]]]
Run Code Online (Sandbox Code Playgroud)
现在将转变为:
[[[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]]]
Run Code Online (Sandbox Code Playgroud)
每行三次重复n次.
我们也炸掉第二个矩阵,这样:
[[x1, y1, z1],
[x2, y2, z2],
...
[xn, yn, zn]]
Run Code Online (Sandbox Code Playgroud)
(记住我们每排少了一对方括号),会爆炸:
[[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]]
Run Code Online (Sandbox Code Playgroud)
如果我们现在减去这两个矩阵,我们得到:
[[[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]]]
Run Code Online (Sandbox Code Playgroud)
因此,我们构造了一个1000×1000×3的矩阵,其中i,j -element元素是一个3元组,包含在第i行指定的点的坐标与在第j行指定的点的坐标之间的差异.我们将结果存储在中diff.
接下来我们diff**2用来计算元素方形,现在:
(diff**2)[i, j] == array([(xi-xj)**2, (yi-yj)**2, (zi-zj)**2])
Run Code Online (Sandbox Code Playgroud)
最后,我们调用.sum(2)该矩阵(这意味着axis=2).这意味着我们为每个元素(diff**2)总结组件,所以:
((diff**2).sum())[i, j] == (xi-xj)**2 + (yi-yj)**2 + (zi-zj)**2
Run Code Online (Sandbox Code Playgroud)
因此,我们计算出1000×1000矩阵,其中[i, j]第元件是正方形的的欧几里德距离.请注意,我们不计算欧氏距离,而是计算欧氏距离.然而,我们可以通过应用np.sqrt(..)结果来计算它,所以:
D = np.sqrt((diff**2).sum(2)) # Euclidean distance
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |