0 和 1 的 2D numpy 数组 - 其中单元格为 1 将周围的 12x12 单元格也设置为 1



有一个大的2D numpy数组,尺寸为1500x1500,代表一个迷宫。单元格包含 0 和 1,其中 0 表示开放空间,1 表示占用空间。我想考虑机器人的尺寸,所以最简单的方法是修改地图,以便在原始单元格为 1 的地方,将周围的单元格设置为任何方向上最多 3 个单元格为 1。

看了一下面具,卷积等,但不知道如何进行,感谢帮助。

1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
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 0 0 0 1 0 0 0 0 0
1 0 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 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

成为

1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0
1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0
1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0
1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0
1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0
1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0
1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0
1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

编辑:简化Q到3x3"掩码"示例

你正在做的事情被称为二元膨胀,可以简单地用scipy.ndimage.morphology.binary_dilation

from scipy.ndimage.morphology import binary_dilation
output = binary_dilation(input, structure = np.ones((7,7)))

如果您想按欧几里得距离而不是曼哈顿距离排除,这也允许您执行诸如倾斜角(通过修补structure数组(之类的操作。

您可以使用numpy.where查找原始maze中所有ones的位置,然后将周围区域中的值s更改为1

import numpy as np
maze = (np.random.random((15, 15)) < 0.02).astype(int)
print(maze)
s = 3
idx = np.where(maze)
for i, j in zip(*idx):
lowerleft = np.array([max(0, i-s), max(0, j-s)])
topright = lowerleft + 2*s+1
maze[lowerleft[0]:topright[0], lowerleft[1]:topright[1]] = 1
print(maze)

最新更新