在二维numpy矩阵中找到特定点距离1内的所有点

时间:2018-10-21 22:33:07

标签: python numpy scipy scipy-spatial

我想在我的numpy矩阵中找到一个点的范围1(或完全对角线)内的点的列表

例如说我的矩阵m是:

[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 1 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]] 

我想获取一个元组列表或一些表示以下带有X的9点的所有坐标的东西:

[[0 0 0 0 0]
 [0 X X X 0]
 [0 X X X 0]
 [0 X X X 0]
 [0 0 0 0 0]]

这是另一个示例,目标点位于边缘:

[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 1]
 [0 0 0 0 0]
 [0 0 0 0 0]] 

在这种情况下,距目标点1的距离内只有6个点:

[[0 0 0 0 0]
 [0 0 0 X X]
 [0 0 0 X X]
 [0 0 0 X X]
 [0 0 0 0 0]] 

编辑:

在这里使用David Herrings有关切比雪夫距离的答案/评论是我尝试解决上述示例2的尝试,假设我知道目标点的坐标:

from scipy.spatial import distance

point = [2, 4]
valid_points = []
for x in range(5):
  for y in range(5):
    if(distance.chebyshev(point, [x,y]) <= 1):
      valid_points.append([x,y])

print(valid_points) # [[1, 3], [1, 4], [2, 3], [2, 4], [3, 3], [3, 4]]

对于更大的数组,这似乎效率不高,因为我只需要检查一小部分单元格,而不是整个martix。

3 个答案:

答案 0 :(得分:1)

这里没有感兴趣的算法。如果您还没有知道 1的位置,则首先必须找到它,并且做的最好不过是搜索每个元素。 (通过使用numpyargmax以C速度执行此操作,您可以 获得恒定因子加速;使用divmod将展平的索引分为行和列。)之后,您要做的就是将坐标加±1(或0),除非它会使您超出数组范围。您永远都不会构造坐标以便以后将其丢弃。

答案 1 :(得分:0)

我认为您正在使它过于复杂-无需依赖复杂的功能

queue

答案 2 :(得分:0)

一种简单的方法是使用笛卡尔积获得所有可能的坐标

设置数据:

x = np.array([[0,0,0], [0,1,0], [0,0,0]])
x
array([[0, 0, 0],
       [0, 1, 0],
       [0, 0, 0]])

您知道坐标将是您所在位置的+/- 1:

loc = np.argwhere(x == 1)[0]  # unless already known or pre-specified
v = [loc[0], loc[0]-1, loc[0]+1]
h = [loc[1], loc[1]-1, loc[1]+1]

output = []
for i in itertools.product(v, h):
    if not np.any(np.array(i) >= x.shape[0]) and not np.any(np.array(i) < 0): output.append(i)

print(output)
[(1, 1), (1, 0), (1, 2), (0, 1), (0, 0), (0, 2), (2, 1), (2, 0), (2, 2)]