Наиболее эффективный способ сравнения каждого элемента двумерного массива с его 8 соседями - PullRequest
0 голосов
/ 10 января 2019

Таким образом, в двоичном массиве я пытаюсь найти точки, где 0 и 1 находятся рядом друг с другом, и перерисовать массив с этими точками пересечения, указанными путем изменения значения 0. Просто интересно, есть ли лучший способ сравнить каждое из значений в массиве numpy с 8 окружающими значениями, чем использование вложенных циклов for.

В настоящее время у меня есть это, которое сравнивается с 4 окружением только для удобства чтения здесь

for x in range(1, rows - 1):
    for y in range(1, columns - 1):
        if f2[x, y] == 0:
            if f2[x-1, y] == 1 or f2[x+1, y] == 1 or f2[x, y-1] == 1 or f2[x, y+1] == 1:
                f2[x, y] = 2

EDIT

Например

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

до

[[1, 1, 1, 1, 1, 1, 1],
 [1, 1, 2, 2, 2, 1, 1],
 [1, 1, 2, 0, 2, 1, 1],
 [1, 1, 2, 2, 2, 1, 1],
 [1, 1, 1, 1, 1, 1, 1]]

1 Ответ

0 голосов
/ 10 января 2019

Эта проблема может быть быстро решена с помощью функций двоичной морфологии

import numpy as np
from scipy.ndimage.morphology import binary_dilation, generate_binary_structure

# Example array
f2 = np.zeros((5,5), dtype=float)
f2[2,2] = 1.

# This line determines the connectivity (all 8 neighbors or just 4)
struct_8_neighbors = generate_binary_structure(2, 2)

# Replace cell with maximum of neighbors (True if any neighbor != 0)
has_neighbor = binary_dilation(f2 != 0, structure=struct_8_neighbors)

# Was cell zero to begin with
was_zero = f2 == 0

# Update step
f2[has_neighbor & was_zero] = 2.
...