2017-02-15 27 views
3

Я хочу пройти через мой 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

один фокус в том, чтобы заменить 'строка-1 'с' 'row- и аналогично для' 'column' –

+1

мин (макс (0, строка -1), MAX_INDEX) ' –

+2

@ TadhgMcDonald-Jensen вам не нужно обрезать с правой стороны; при разрезании слишком большой верхней границы обрабатывается изящно. –

ответ

0

Вы можете упростить способ написания вашего цикла и не предполагать столько информации о содержимом массива, что делает ваш код более гибким. Numpy имеет класс nditer, который может использоваться для итерации по массиву. Вы также можете использовать его для получения multi-dimensional index каждого элемента. Итерацию можно дополнительно упростить, используя класс ndenumerate, аналогичный встроенному Pythons enumerate. Если вам не нужно возвращать элементы, просто указатель, вы можете использовать ndindex. Ниже приведен пример использования ndindex: (! = Строка 0)

for r, c in ndindex(tilemap.shape): 
    check = tilemap[max(r-1, 0):min(r+1, mapheight), max(c-1, 0):min(c+1, mapwidth)] 
    print(check) 
+0

Это полезно. Я вернулся к этой теме, потому что хотел знать, как искать большую область вокруг определенного индекса. Я сделал это, но код был отвратительным. Это отлично подходит для этого. Вот код, который я использовал для поиска во всех направлениях длиной 3. для i, j in np.ndindex (a.(j-3, 0): min (j + 4, width)] print (i, j) печать (проверка) – Tea

+0

@Tea. Вы должны выбрать ответы, которые помогут вам решить вашу проблему. Это стандартная процедура работы на этом сайте. Вы всегда можете изменить свой выбор позже. –