在numpy中找到坐标之间的欧氏差异
Finding euclidean difference between coordinates in numpy
我正在尝试使用以下代码使用 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)
谁能解释一下上面两行是做什么的?我不明白这是如何计算坐标的欧氏距离的。
第一个计算一个随机的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]
个元素是平方 51=]欧氏 距离。请注意,我们不是计算欧几里德距离,而是它的平方。然而,我们可以通过对结果应用 np.sqrt(..)
来计算它,因此:
D = np.sqrt((diff**2).sum(2)) # 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)
谁能解释一下上面两行是做什么的?我不明白这是如何计算坐标的欧氏距离的。
第一个计算一个随机的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]
个元素是平方 51=]欧氏 距离。请注意,我们不是计算欧几里德距离,而是它的平方。然而,我们可以通过对结果应用 np.sqrt(..)
来计算它,因此:
D = np.sqrt((diff**2).sum(2)) # Euclidean distance