Litwos
Litwos

Reputation: 1338

Extract submatrix at certain row/col values

I need to slice a 2D input array from row/col indices and a slicing distance. In my example below, I can extract a 3x3 submatrix from an input matrix, but I cannot adapt this code to work for any search distance I would like, without resorting to manually writing down the indices:

Example:

import numpy as np

# create matrix
mat_A = np.arange(100).reshape((10, 10))

row = 5
col = 5

# Build 3x3 matrix around the centre point
matrix_three = ((row - 1, col - 1),
                (row, col - 1),
                (row + 1, col - 1),
                (row - 1, col),
                (row, col),  # centre point
                (row + 1, col),
                (row - 1, col + 1),
                (row, col + 1),
                (row + 1, col + 1))

list_matrix_max_values = []

for loc in matrix_three:
    val = mat_A[loc[0]][loc[1]]
    list_matrix_max_values.append(val)


submatrix = np.matrix(list_matrix_max_values)
print(submatrix)

Returns:

[[44 54 64 45 55 65 46 56 66]]

How can I do the same thing if i would like for example to extract a 5x5 matrix around the cell defined by my row/col indices? Thanks in advance!

Upvotes: 3

Views: 5969

Answers (2)

ddg
ddg

Reputation: 1098

Numpy has matrix slicing, so you can slice on both rows and columns.

mat_A[4:7, 4:7]

returns

  [[44, 45, 46],
   [54, 55, 56],
   [64, 65, 66]]

Upvotes: 3

DYZ
DYZ

Reputation: 57075

S=3 # window "radius"; S=3 gives a 5x5 submatrix
mat_A[row-S+1:row+S,col-S+1:col+S]
#array([[33, 34, 35, 36, 37],
#       [43, 44, 45, 46, 47],
#       [53, 54, 55, 56, 57],
#       [63, 64, 65, 66, 67],
#       [73, 74, 75, 76, 77]])

Upvotes: 2

Related Questions