2024-09-26 17:42:46 发布
网友
我尝试使用以下代码使用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之间,因此行表示三维单位立方体中的点:
np.random.random((1000, 3))
接下来我们使用resheme,构造一个带有X.reshape(1000, 1, 3)的1000×1×3矩阵。在
X.reshape(1000, 1, 3)
当我们在广播中流行的时候,那就是“数字矩阵”。所以我们有一个1000×1×3矩阵和一个1000×1×3矩阵。这意味着我们将通过假设重复第二维度1000次来“炸毁”第一个矩阵。所以像这样的矩阵:
现在将转换为:
[[[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-th元素是一个三元组,它包含在行i指定的点的坐标与在行j指定的点的坐标差。我们将结果存储在diff。在
diff
接下来我们使用diff**2来计算元素平方,现在:
diff**2
(diff**2)[i, j] == array([(xi-xj)**2, (yi-yj)**2, (zi-zj)**2])
最后我们在这个矩阵上调用.sum(2)(这意味着axis=2)。这意味着我们将对(diff**2)的每个元素求和,然后:
.sum(2)
axis=2
(diff**2)
因此,我们计算了一个1000×1000矩阵,其中[i, j]-第个元素是欧氏距离的平方。注意,我们计算的不是欧几里得距离,而是它的平方。但是,我们可以通过在结果上应用np.sqrt(..)来计算它,因此:
[i, j]
np.sqrt(..)
D = np.sqrt((diff**2).sum(2)) # Euclidean distance
第一个计算一个随机的1000×3矩阵,所有值都在0和1之间,因此行表示三维单位立方体中的点:
接下来我们使用resheme,构造一个带有
X.reshape(1000, 1, 3)
的1000×1×3矩阵。在当我们在广播中流行的时候,那就是“数字矩阵”。所以我们有一个1000×1×3矩阵和一个1000×1×3矩阵。这意味着我们将通过假设重复第二维度1000次来“炸毁”第一个矩阵。所以像这样的矩阵:
^{pr2}$现在将转换为:
其中每个三元组每行重复n次。在
我们也放大了第二个矩阵,这样:
(请注意,我们每行少了一对方括号),将放大为:
如果我们现在减去这两个矩阵,我们得到:
因此我们构造了一个1000×1000×3矩阵,其中i,j-th元素是一个三元组,它包含在行i指定的点的坐标与在行j指定的点的坐标差。我们将结果存储在
diff
。在接下来我们使用
diff**2
来计算元素平方,现在:最后我们在这个矩阵上调用
^{8}$.sum(2)
(这意味着axis=2
)。这意味着我们将对(diff**2)
的每个元素求和,然后:因此,我们计算了一个1000×1000矩阵,其中
[i, j]
-第个元素是欧氏距离的平方。注意,我们计算的不是欧几里得距离,而是它的平方。但是,我们可以通过在结果上应用np.sqrt(..)
来计算它,因此:相关问题 更多 >
编程相关推荐