Доступ к клеткам, окружающим очаговую клетку в массиве - PullRequest
0 голосов
/ 02 ноября 2018

Я хочу извлечь ячейки оранжевого и зеленого цвета отдельно в следующем массиве numpy:

enter image description here

Я мог бы сделать это путем жесткого кодирования, например arr [0, 1] относится к верхней левой ячейке сетки. Есть ли способ сделать это более элегантно?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Предположим, у вас есть массив N*N с именем a, вы можете просто сделать:

np.concatenate((a[k:-k:N-2*k-1,k:-k], a[k+1:-k-1,k:-k:N-2*k-1]), None)

для извлечения k-го раунда (начиная с нуля), где первый срез обозначает два ряда, а второй срез - два столбца.

Пример (выходные данные отсортированы для упрощения проверки):

N = 8
k = 1
a = np.arange(N * N).reshape(N, N)
print(a)
print(np.sort(np.concatenate((a[k:-k:N-2*k-1,k:-k], a[k+1:-k-1,k:-k:N-2*k-1]), None)))

который выдаст:

[[ 0  1  2  3  4  5  6  7]
 [ 8  9 10 11 12 13 14 15]
 [16 17 18 19 20 21 22 23]
 [24 25 26 27 28 29 30 31]
 [32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47]
 [48 49 50 51 52 53 54 55]
 [56 57 58 59 60 61 62 63]]
[ 9 10 11 12 13 14 17 22 25 30 33 38 41 46 49 50 51 52 53 54]
0 голосов
/ 02 ноября 2018

Использовать логический mask массив:

arr = np.random.permutation(np.arange(25)).reshape(5,5)

>>> arr
array([[15,  9,  7,  1, 22],
   [16,  4,  2, 19, 13],
   [12,  3, 23,  8,  6],
   [ 0, 20, 21, 10, 14],
   [18,  5, 24, 11, 17]])

Выше строится случайная матрица для этой цели.

# Build mask
mask = np.ones((5,5)) == True
mask[1:4, 1:4] = False

>>> mask
array([[ True,  True,  True,  True,  True],
   [ True, False, False, False,  True],
   [ True, False, False, False,  True],
   [ True, False, False, False,  True],
   [ True,  True,  True,  True,  True]])

# Extract values:
>>> arr[mask]
array([15,  9,  7,  1, 22, 16, 13, 12,  6,  0, 14, 18,  5, 24, 11, 17])

Создайте следующую маску для внутреннего круга:

mask = np.ones((5,5)) == False
mask[1:4, 1:4] = True
mask[2,2] = False

>>> mask
array([[False, False, False, False, False],
   [False,  True,  True,  True, False],
   [False,  True, False,  True, False],
   [False,  True,  True,  True, False],
   [False, False, False, False, False]])

arr[mask]
>>> array([ 0, 15, 20, 16,  4,  1,  6,  8])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...