Я хочу пройти через мой 2D-массив numpy и проверить все его непосредственные соседи. Если я сделать NumPy массив следующим образом:Как нарезать 2D-массив numpy, чтобы получить его прямых соседей?
tilemap = np.arange(16).reshape(4,4)
Это будет выглядеть примерно так:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
цикл, который я создал, чтобы помочь мне найти соседей для каждой точки в массиве выглядит это:
import numpy as np
mapwidth = 4
mapheight = 4
tilemap = np.arange(mapwidth * mapheight).reshape(mapwidth, mapheight)
row = 0
for i in tilemap:
count = 0
for j in i:
column = j % mapwidth
check = tilemap[row-1:row+2, column-1:column+2]
print(check)
count += 1
if count % mapheight == 0:
row += 1
Однако, когда я делаю это, я не нашел каких-либо соседей по месту в массиве со значениями 0, 1, 2, 3, 4, 8 и 12. Я понимаю, почему это это e случай. например, если я принимаю значение 8., он имеет индексы [2,0]. строка-1 приведет к -1, что в этом примере совпадает с индексом 3. строка + 2 равно 2. И нарезка 2: 3 приведет ничего, потому что нет ничего между 2 и 3.
Во всяком случае, результат я ищу что-то вроде этого (для значения 8):
[[4 5]
[ 8 9]
[12 13]]
Я знаю, что могу добиться этого, собирая некоторые if-утверждения, но мне интересно, есть ли более элегантный способ справиться с этим.
Спасибо за ваше время.
(Для тех, кому это интересно узнать): Соседи, например. значение 11 действительно возвращается, как я хочу, без каких-либо ошибок. Он возвращает это:
[[6 7]
[10 11]
[14 15]]
EDIT:
Я должен также упомянуть, я попытался это:
check = np.take(tilemap, tilemap[row-1:row+2, column-1:column+2], mode = 'clip')
Но это не сработало.
один фокус в том, чтобы заменить 'строка-1 'с' 'row- и аналогично для' 'column' –
мин (макс (0, строка -1), MAX_INDEX) ' –
@ TadhgMcDonald-Jensen вам не нужно обрезать с правой стороны; при разрезании слишком большой верхней границы обрабатывается изящно. –