在numpy中求坐标间的欧几里德差

2024-06-16 09:43:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用以下代码使用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)

有人能给我解释一下这两条线是干什么的吗?我不明白这是怎么计算坐标的欧几里得距离的。在


Tags: to代码numpynpdiffrandomfindusing
1条回答
网友
1楼 · 发布于 2024-06-16 09:43:13

第一个计算一个随机的1000×3矩阵,所有值都在0和1之间,因此行表示三维单位立方体中的点:

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

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

当我们在广播中流行的时候,那就是“数字矩阵”。所以我们有一个1000×1×3矩阵和一个1000×1×3矩阵。这意味着我们将通过假设重复第二维度1000次来“炸毁”第一个矩阵。所以像这样的矩阵:

^{pr2}$

现在将转换为:

[[[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**2来计算元素平方,现在:

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

最后我们在这个矩阵上调用.sum(2)(这意味着axis=2)。这意味着我们将对(diff**2)的每个元素求和,然后:

^{8}$

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

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

相关问题 更多 >