首页 > 解决方案 > 在二维 Numpy 数组中查找最近的元素

问题描述

我有一个二维 numpy 数组,例如:

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

我们可以将其视为从上方查看的地图。我会选择一个随机单元格,比如说第 3 行第 4 列(从 0 开始计数)。如果单元格包含 1,则没有问题。如果单元格是 0,我需要找到最接近 1 的索引。

在这里,第 3 行第 4 列是 0,我想要一种方法来找到最接近的 1,即第 4 行第 5 列。

当然这是我的问题的一个简化示例,我的实际 np 数组不包含零和一,而是包含无和浮点数

标签: pythonpython-3.xnumpynumpy-ndarray

解决方案


这是一个简单的“寻路”问题。准备一个空的坐标队列并将起始位置推送到队列中。然后,从队列中弹出第一个元素并检查位置,如果它是 1,则返回坐标,否则将所有邻居推入队列并重复。

ADJACENT = [(0, 1), (1, 0), (0, -1), (-1, 0)]

def find(data: np.array, start: tuple):
  queue = deque()
  deque.append(start)
  while queue:
    pos = queue.popleft()
    if data[pos[0], pos[1]]:
      return position
    else:
      for dxy in ADJACENT:
        (x, y) = (pos[0] + dxy[0], pos[1], dxy[1])
        if x >= 0 and x < data.size[0] and y >= and y < data.size[1]:
          queue.append((x,y))
  return None
      

推荐阅读