Нарезать подматрицу с индексами центрального элемента - PullRequest
1 голос
/ 06 ноября 2019

Учитывая матрицу A, а также список индексов строк и список индексов столбцов, как эффективно извлечь квадратные подматрицы с размером k, центрированным индексами строк и столбцов?

Например:

A = array([[12,  6, 14,  8,  4,  1],
       [18, 13,  8, 10,  9, 19],
       [ 8, 15,  6,  5,  6, 18],
       [ 3,  0,  2, 14, 13, 12],
       [ 4,  4,  5, 19,  0, 14],
       [16,  8,  7,  7, 11,  0],
       [ 3, 11,  2, 19, 11,  5],
       [ 4,  2,  1,  9, 12, 12]])
r = np.array([2, 5])
c = np.array([3, 2])
k = 3

Выходные данные должны быть A[1:4, 2:5] и A[4:7, 1:4]. Таким образом, в основном выходные данные представляют собой квадратные подматрицы размером kxk и центрированы на элементах [r, c] (в данном случае A [2,3] и A [5,2])

Как это сделатьэто качественно и элегантно? Спасибо

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Вы имеете в виду что-то вроде этого?

for x,y in zip(r,c):
    s = k // 2
    print("position:",[x - s,x + s + 1], [y - s,y + s + 1])
    print(A[x - s:x + s + 1,y - s:y + s + 1])
    print()

Вывод:

position: [1, 4] [2, 5]
[[ 8 10  9]
 [ 6  5  6]
 [ 2 14 13]]

position: [4, 7] [1, 4]
[[ 4  5 19]
 [ 8  7  7]
 [11  2 19]]

Обратите внимание, что k должно быть нечетным здесь

1 голос
/ 06 ноября 2019

Для случая, когда подматрицы имеют одинаковую форму, мы можем получить скользящие окна и затем индексировать их с начальными индексами вдоль строк и столбцов для нашего желаемого результата. Чтобы получить эти окна, мы можем использовать np.lib.stride_tricks.as_strided на основе scikit-image's view_as_windows. Подробнее об использовании as_strided на основе view_as_windows -

from skimage.util.shape import view_as_windows

# Get all sliding windows
w = view_as_windows(A,(k,k))

# Select relevant ones for final o/p
out = w[r-k//2,c-k//2]
...