2D numpy массив нулей и единиц - где ячейки равны 1, для окружающих ячеек 12x12 также устанавливается значение 1 - PullRequest
0 голосов
/ 24 января 2020

имеют большой массив 2d numpy, размеры 1500x1500, который представляет собой лабиринт. Ячейки содержат 0 и 1, где 0 - открытое пространство, а 1 - занято. Я хочу учесть размеры робота, поэтому самый простой способ сделать это - изменить карту так, чтобы там, где исходные ячейки равны 1, установите окружающие ячейки на расстоянии до 3 ячеек в любом направлении до 1.

Имел посмотрите на маски, свертку и т. д. c, но не знаете, как поступить, благодарны за помощь.

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 "маска" с примером

Ответы [ 2 ]

2 голосов
/ 24 января 2020

То, что вы делаете, называется бинарным расширением и может быть выполнено просто с помощью scipy.ndimage.morphology.binary_dilation

from scipy.ndimage.morphology import binary_dilation

output = binary_dilation(input, structure = np.ones((7,7)))

Это также позволяет вам делать такие вещи, как выпадение углов (манипулируя с structure массив), если вы хотите исключить евклидовы расстояния вместо манхэттенских.

1 голос
/ 24 января 2020

Вы можете использовать numpy.where, чтобы найти местоположения всех ones в исходном maze, а затем изменить значения в окрестностях 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...