У меня есть набор двумерных массивов, содержащих широту и долготу области карты, с бинарной маской, обозначающей сушу (0) или океан (1). Что меня интересует, так это извлечение индексов для всех прибрежных элементов океана (элементы маски 1, которые примыкают к 0, в том числе по диагонали), чтобы я мог использовать эти индексы для извлечения lats+lons всех прибрежных элементов из других массивов. .
Учитывая массив:
a = np.array([[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 0, 0, 0, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1]])
Я ищу способ вернуться:
(array([0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4]),
array([1, 2, 3, 0, 1, 3, 4, 0, 4, 0, 1, 3, 4, 1, 2, 3]))
где каждый массив имеет индексы для каждой оси.
Этот выходной формат похож на np.where(), я думаю, что я пытаюсь сделать это np.where(a == рядом с 0).
Пробуем convolve2d
:
from scipy.signal import convolve2d
kernel = np.full((3,3), 1)
# remove center of kernel -- not count 1 at the center of the square
# we may not need to remove center
# in which case change the mask for counts
kernel[1,1]=0
# counts 1 among the neighborhoods
counts = convolve2d(a, kernel, mode='same',
boundary='fill', fillvalue=1)
# counts==8 meaning surrounding 8 neighborhoods are all 1
# change to 9 if we leave kernel[1,1] == 1
# and we want ocean, i.e. a==1
np.where((counts != 8) & (a==1))
Выход:
(array([0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4]),
array([1, 2, 3, 0, 1, 3, 4, 0, 4, 0, 1, 3, 4, 1, 2, 3]))
@Moosefeather Да, конечно. Я добавлял комментарии в код только для того, чтобы сказать это.
Не могли бы вы также исключить
kernel[1,1]=0
и использоватьnp.where((s!=9) & (a==1))
?