根据相邻元素进行选择

时间:2018-01-01 15:58:17

标签: python numpy

说我有一些numpy数组myArr。我知道我可以轻松地选择myArr > x来查找值高于x的元素的索引。

如何找到相邻元素高于x的元素索引?对于1d数组,元素相邻某些idx(idx-1, idx+1)。对于d维度的数组,我的意思是任何维度中的邻居。也就是说,让d=3myArr[2, 2, 2]的邻居是[(1, 2, 2), (2, 1, 2), (2, 2, 1), (3, 2, 2), (2, 3, 2), (2, 2, 3)]

例如,点击

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

在这里,我们可以用图形方式将5的相邻元素视为[1, 4, 6, 9]

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

我希望能够根据相邻元素进行选择。例如,我想要所有索引,相邻元素为>= 9。在上面的示例中,以下值将成立:[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]4不计算我定义的邻居而不是对角线。)

我的预期输出将是典型的二进制矩阵:

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

如果它适用于任何尺寸,那就太棒了,但我需要它至少在3上工作。

1 个答案:

答案 0 :(得分:3)

获取大于阈值的元素的掩码,只需使用binary_dilation和适当的内核来选择北+东+西+南,如此 -

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)