【问题标题】:Select based on neighbouring elements根据相邻元素选择
【发布时间】:2018-01-01 15:58:16
【问题描述】:

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

我如何找到元素的索引,相邻的元素在x之上?对于一维数组,元素相邻一些idx(idx-1, idx+1)。对于d 维度的数组,我的意思是在 any 维度中相邻。也就是说,让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 上工作。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    获取大于阈值的元素掩码,只需使用带有适当内核的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)
    

    【讨论】:

    • 只是为了确保我理解这个概念:如果我将[0, 0, 0] 添加到内核中,它也会选择元素本身是否 >=9,即使相邻元素不是?
    • @FooBar 只选择它自己,它将是:kernel = np.array([[0,0,0],[0,1,0],[0,0,0]])。 (1,1) 处的内核中心对应于元素本身。
    • @FooBar .. 与mask 相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多