Как создать массив соседей из каждого элемента в массивном двумерном массиве - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь создать массив соседей для каждого элемента в массиве.Есть ли способ использовать методы векторизации, чтобы ускорить его?

Я использовал вложенный цикл for для перебора каждого элемента в массиве для создания.

Исходный массив

self.grid = np.zeros((256,256), np.uint)

Массив соседей из исходного массива

        for i in range(256):
            for j in range(256):

                grid = [[self.grid[i-1][j-1], self.grid[i][j-1], self.getGrid[i+1][j-1]],
                        [self.grid[i-1][j], self.grid[i][j], self.grid[i+1][j]],
                        [self.grid[i-1][j+1], self.grid[i][j+1], self.grid[i+1][j+1]]]

(этот код не учитывает крайние случаи)

1 Ответ

0 голосов
/ 08 мая 2019

Вы можете использовать np.roll(), чтобы сдвинуть массив и сгенерировать массив соседей.Это дает дополнительное преимущество «прокручивания» границ (т. Е. Правая сторона самого правого элемента является самым левым элементом).

Что касается вашего примера, здесь возможна реализация с использованием np.roll, хотя я сомневаюсьэто самый чистый:

left=np.roll(self.grid,1,axis=1)
right=np.roll(self.grid,-1,axis=1)
down=np.roll(self.grid,-1,axis=0)
up=np.roll(self.grid,1,axis=0)
leftbottom=np.roll(left,-1,axis=0)
rightbottom=np.roll(right,-1,axis=0)
lefttop=np.roll(left,1,axis=0)
righttop=np.roll(right,1,axis=0)

neighbors2 = [np.array(i) for i in zip(*(np.ndarray.flatten(i) \
for i in (left, right, down, up, leftbottom, rightbottom, lefttop, righttop)))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...