Python – Selection based on adjacent elements

Selection based on adjacent elements… here is a solution to the problem.

Selection based on adjacent elements

Let’s say I have some numpy array myArr. I know I can easily select myArr > x to find the index of an element with a value higher than x.

How do I find the element index of an adjacent element above x? For one-dimensional arrays, the element neighboring some idx is (idx-1, idx+1). For arrays of dimension d, I mean adjacent in any dimension. i.e. d=3. myArr[2, 2, 2]’s neighbors are [(1, 2, 2), (2, 1, 2), (2, 2, 1), (3, 2, 2), (2, 3, 2), (2, 2, 2, 3)].

For example, take

import numpy as np
test = np.arange(4**2).reshape((4,4))

Here, we can graphically see that the adjacent elements of 5 are [1, 4, 6, 9].

test
Out[10]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

I want to be able to choose based on adjacent elements. For example, I want all indexes with adjacent elements of >=9. The following values apply in the example above: [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15](4 really doesn’t count the adjacent no more than diagonal I defined.) )

My expected output would be a typical binary matrix:

neighboringIndicesLargerThan(myArr, 9)
array([[False, False, False, False],
   [False,  True,  True,  True],
   [ True,  True,  True,  True],
   [ True,  True,  True,  True]], dtype=bool)

It would be great if it worked on any size, but I need it to work at least 3.

Solution

Get an element mask greater than the threshold and simply use binary_dilation Use the appropriate kernel to select the north + east + west + south, like this-

In [20]: from scipy.ndimage.morphology import binary_dilation

In [21]: mask = test >= 9

In [22]: kernel = np.array([[0,1,0],[1,0,1],[0,1,0]])

In [23]: binary_dilation(mask, kernel)
Out[23]: 
array([[False, False, False, False],
       [False,  True,  True,  True],
       [ True,  True,  True,  True],
       [ True,  True,  True,  True]], dtype=bool)

Related Problems and Solutions