python - 在二维 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 列。
- 如果两个包含 1 的单元格距离相同,我不在乎我得到哪一个。
- 边界不相互连接,即单元格第 7 列第 9 列最接近的 1 不是第 1 行第 7 列第 0 列
当然这是我的问题的一个简化示例,我的实际 np 数组不包含零和一,而是包含无和浮点数
解决方案
这是一个简单的“寻路”问题。准备一个空的坐标队列并将起始位置推送到队列中。然后,从队列中弹出第一个元素并检查位置,如果它是 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
推荐阅读
- python - 将 tensorflow 低级 API(张量/占位符)与 Keras 模型相结合
- python-3.x - python中的日期时间格式附加到文件名
- python-3.x - 我怎样才能让python接受来自键盘的小写或大写输入
- javascript - 在进行任何验证时如何理解正则表达式
- c# - HttpContext.Response.Redirect .NET Core 返回 404
- .net-core - 在 Blazor 中 - 找不到类型或命名空间名称“App”(您是否缺少 using 指令或程序集引用?
- python - 在 SWIG Python 生成的函数中插入一些代码行
- python - 仅在具有多索引的一级系列上使用 agg 方法
- assembly - MIPS 将 $a0 中的字符转换为大写
- python - 为什么我的程序在第二个 for 循环中不起作用?