根据最近距离

时间:2017-02-03 15:08:01

标签: python arrays numpy

我有一个numpy数组,其中包含这样的坐标点

[[ 581  925]
 [ 582  926]
 [ 582  931]
 [ 582  939]
 [ 584  933]
 [ 584  937]
 [ 585  943]
 [ 586  944]
 [ 589  944]]

正如您所看到的,有些点具有相同的x坐标但y坐标不同。 从第一个坐标开始,计算到下一个最近的直接坐标的距离。
例如,找出[581 925]到下一个最近坐标的距离。候选人是[ 582 926], [ 582 931] & [ 582 939],因为这些是最接近[581 925]的直接坐标。

在这种情况下显而易见[582 926]是距离[581 925]最近的坐标,我只希望该坐标存在,并删除其他2个候选坐标。所以结果数组应该是

[[ 581  925]
 [ 582  926]
      .
      .
      .
 [ 589  944]]

现在应该从[582 926]开始执行相同的操作,直到结束。

使用未过滤的坐标轮廓:
enter image description here

使用过滤坐标轮廓:
enter image description here

对于最简单的时间复杂度来说,最py(最好的numpy)方法是什么?因为它是最关注的?

注意:线条细化不是问题,只关注去除不必要的点/坐标。

1 个答案:

答案 0 :(得分:1)

我设法做到了这样:

对于要使用的方法,首先必须根据相等的x轴值将数组拆分为sup组。有关详细信息,请参阅this post。我会在下面添加代码。 重要的是,数组按照x轴的升序排序。如果不是,你可以通过在数组上应用np.lextsort来实现这一点。 。请参阅this post以了解如何正确应用lexsort。非常感谢 @Divakar 为这些帖子提供了精彩的答案。

<强>代码:

# Initial array of coordinates

a = np.array([[ 581  925]
     [ 582  926]
     [ 582  931]
     [ 582  939]
     [ 584  933]
     [ 584  937]
     [ 585  943]
     [ 586  944]
     [ 589  944]])

# Following line splits the array into subgroups on the basis of equal x-axis elements
a = np.split(a, np.unique(a[:, 0], return_index=True)[1][1:], axis=0)

# Array after splitting
# [array([[581, 925]]), 
#  array([[582, 926], [582, 931], [582, 939]]), 
#  array([[584, 933], [584, 937]]), 
#  array([[585, 943]]), 
#  array([[586, 944]]), 
#  array([[589, 944]])]

i = 0

# filteredList will initially contain the first element of the array's first sub group
filteredList = np.reshape(np.asarray(a[0][0]), (-1, 2)) # filteredList = [[581 925]]

while not i == len(a) - 1:
    if len(a[i + 1]) > 1:
        # Following line calculates the euclidean distance between current point and the points in the next group
        min_dist_point_addr = np.argmin(np.linalg.norm(filteredList[i] - a[i + 1], axis=1))

        # Next group is reassigned with the element to whom the distance is the least
        a[i + 1] = a[i + 1][min_dist_point_addr]

    # The element is concatenated to filteredList
    filteredList = np.concatenate((filteredList, np.reshape((a[i+1]), (1, 2))), axis=0)
    i += 1

print filteredList

<强>输出:

[[581 925]
 [582 926]
 [584 933]
 [585 943]
 [586 944]
 [589 944]]