【问题标题】:Sort an array of multi D points by distance to a reference point按到参考点的距离对多 D 点数组进行排序
【发布时间】:2020-08-05 22:25:20
【问题描述】:

我有一个参考点p_ref 存储在一个形状为 (1024,) 的 numpy 数组中,类似于:

print(p_ref)
>>> array([ p1,  p2,  p3, ..., p_n])

我还有一个 numpy 数组 A_points,其形状为 (1024,5000),包含 5000 个点,每个点有 1024 个维度,如 p_ref。我的问题:我想将A_points 中的点按它们到p_ref 的(欧几里德)距离排序!

我该怎么做?我读到了scipy.spatial.distance.cdistscipy.spatial.KDTree,但它们都没有完全按照我的意愿去做,当我试图将它们结合起来时,我弄得一团糟。谢谢!


为了参考和一致性,我们假设:

p_ref = np.array([0,1,2,3])
A_points = np.reshape(np.array([10,3,2,13,4,5,16,3,8,19,4,11]), (4,3))

预期输出:

array([[ 3,  2, 10],
       [ 4,  5, 13],
       [ 3,  8, 16],
       [ 4, 11, 19]])

【问题讨论】:

  • 你还能为玩具示例添加预期的输出吗?我会假设输出只是A_points 的不同行顺序。
  • @Divakar 当然,我添加了它:)

标签: python numpy sorting multidimensional-array distance


【解决方案1】:

编辑:更新了 OP 的建议。

希望我理解正确,但您可以使用numpy.linalg.norm 计算两个向量之间的距离。使用它应该很简单:

A_sorted = sorted( A_points.T, key = lambda x: np.linalg.norm(x - p_ref ) )
A_sorted = np.reshape(A_sorted, (3,4)).T

【讨论】:

  • 谢谢,我喜欢简单的答案,尽管其他一些方法可能更快!为了让它工作,虽然我必须转置A_points 并最终重塑答案,看起来像这样:A_sorted = sorted( A_points.T, key = lambda x: np.linalg.norm(x - p_ref ) )A_sorted = np.reshape(A_sorted, (3,4)).T。我接受你的帖子作为答案,但如果你想按照建议编辑它,我还在我最初的问题中提供了玩具值
【解决方案2】:

你可以这样做 -

A_points[:,np.linalg.norm(A_points-p_ref[:,None],axis=0).argsort()]

另一个np.einsum 应该比np.linalg.norm 更有效-

d = A_points-p_ref[:,None]
out = A_points[:,np.einsum('ij,ij->j',d,d).argsort()]

进一步优化以利用快速矩阵乘法替换最后一步 -

A_points[:,((A_points**2).sum(0)+(p_ref**2).sum()-2*p_ref.dot(A_points)).argsort()]

【讨论】:

  • 谢谢!第一个建议很好,但要让它起作用,我必须转置A_points 并摆脱[:,None],最终得到A_out = A_points.T[np.linalg.norm(A_points.T-p_ref,axis=1).argsort()]。如果您关心,您可以编辑您的答案。您也可以使用这些玩具值进行测试,它们与我在帖子中的尺寸一致:p_ref = np.array([0,1,2,3])A_points = np.reshape(np.array([10,3,2,13,4,5,16,3,8,19,4,11]), (4,3))。第二个建议的尺寸也有问题,但我使它适用于dim(A)=(4,4),如果您愿意,也可以更改它。
  • @NeStack 你确定吗?两者似乎对我来说都很好。是什么让您得出结论认为这些都行不通?
  • 再次感谢您的回答!我刚刚测试了您在玩具值上呈现它们的方式您的 sn-ps,并且它们没有进行所需的计算,尽管它们运行时没有错误(请注意 dim(p_ref)=n, dim(A_points)=( n,m),我还在问题中包含了玩具值以使其更清晰)。不过,我只需要旋转变量来使它们工作,所以 +1。
  • @NeStack 所以,我认为你的意思是对A_points 的每一行进行排序。这就是混乱。代码已编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
相关资源
最近更新 更多