说我有一些numpy数组myArr
。我知道我可以轻松地选择myArr > x
来查找值高于x
的元素的索引。
如何找到相邻元素高于x
的元素索引?对于1d数组,元素相邻某些idx
为(idx-1, idx+1)
。对于d
维度的数组,我的意思是任何维度中的邻居。也就是说,让d=3
。 myArr[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上工作。
答案 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)