【问题标题】:2D numpy array- check to see if all adjacent terms are equal2D numpy 数组 - 检查所有相邻项是否相等
【发布时间】:2014-12-27 00:41:28
【问题描述】:

我从一个 nxm 布尔数组开始,它定义了区域——如果它在区域中,则为 true,否则为 false。例如:

r = np.array([[ 0,  0,  1,  1,  1],
              [ 0,  1,  1,  0,  0],
              [ 0,  1,  1,  1,  0],
              [ 1,  1,  1,  0,  0],
              [ 1,  1,  0,  0,  0]])

区域之间的线可以定义为一个 n-1 x m-1 数组,它表示每组四个值之间的一个“点”。如果所有 4 个周围值都相同,则您不在区域之间的边缘。如果 4 个值中的任何一个值不同,那么您就是。对于上面的 r:

l = np.array([[ 1, 1, 1, 1],
              [ 1, 0, 1, 1],
              [ 1, 0, 1, 1],
              [ 0, 1, 1, 0]])

有什么想法可以有效地做到这一点吗?我试过在两个方向上做一个差异,但这会加倍。有 2D 差异功能吗?还有其他方法吗?

【问题讨论】:

    标签: python arrays numpy transformation edge-detection


    【解决方案1】:

    已经选择了一个好的答案,但我喜欢易于编写和理解的解决方案,所以我仍然会发布这个:

    from scipy.signal import convolve2d
    kernel = np.array(((1, 1), (1, 1)))
    
    x = convolve2d(r, kernel, mode="valid")   # sum all the neighboring values (and mode handles the boundary issues)
    x[x==4] = 0                               # set the elements that sum to 4 to zero (the ones that sum to 0 are already 0)
    x[x>0] = 1                                # anything greater than one is set to 1
    
    [[1 1 1 1]
     [1 0 1 1]
     [1 0 1 1]
     [0 1 1 0]]
    

    【讨论】:

    • 是/+1,我喜欢这个 b/c,它当然更容易阅读。因为好奇,我进行了一些速度测试。我的解决方案在示例数组上快了 30%,并且随着数组变大,速度会快得多。 ;)
    • @farenorth:当然,可能是因为所有的乘法。
    【解决方案2】:

    这将对True包围的进行测试,

    tmp = r[1:] & r[:-1]
    l = np.logical_not(tmp[:, 1:] & tmp[:, :-1])
    

    然后你可以用同样的方法对False包围的进行测试,并把它们组合起来,

    r = np.logical_not(r)
    tmp = r[1:] & r[:-1]
    l &= np.logical_not(tmp[:, 1:] & tmp[:, :-1])
    
    print l.astype(int)
    # [[1 1 1 1]
    #  [1 0 1 1]
    #  [1 0 1 1]
    #  [0 1 1 0]]
    

    【讨论】:

    • 是的,我注意到了,我修好了。谢谢!
    • +1 修复,如果示例语法正确且更易于测试,问题会更好。
    • 效果很好。谢谢。此外,修复了示例语法。我的错。
    猜你喜欢
    • 2016-09-13
    • 2013-01-27
    • 2015-02-12
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多