【问题标题】:Calculate number of equal neighbouring cells within a numpy array计算一个numpy数组中相等的相邻单元格的数量
【发布时间】:2016-07-21 22:06:56
【问题描述】:

我有不同大小的二维二进制 numpy arrays,其中包含某些模式。 就像这样:

import numpy
a = numpy.zeros((6,6), dtype=numpy.int)
a[1,2] = a[1,3] = 1
a[4,4] = a[5,4] = a[4,3] = 1

这里的“图像”包含两个补丁,一个有 2 个,一个有 3 个连接单元。

print a
array([[0, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 1, 0],
       [0, 0, 0, 0, 1, 0]])


我想知道一个非零单元格与另一个非零单元格接壤的频率(邻居定义为 rook 的情况,因此每个单元格左侧、右侧、下方和上方的单元格)包括它们的伪复制(反之亦然)。

之前的 approach 用于计算外边界返回错误值 (5)。

numpy.abs(numpy.diff(a, axis=1)).sum()

所以对于上面的测试数组,正确的总结果应该是 6(上面的补丁有两个内部边界,下面有四个)。

感谢任何提示!

编辑:

  • 错误:下层明显有4条内边(相邻单元格值相同)

  • 详细解释了所需的社区

【问题讨论】:

  • “邻居定义为车的情况”是什么意思?
  • 为什么低位是六?
  • 嗯,显而易见的解决方案是对索引和计数进行双循环。
  • 我需要检查每个单元格(车)左、右、下方和上方的邻居是否等于中心单元格。 @HYRY:错了,抱歉。较低的有4个内部边界(单元格相邻的单元格具有相同的值)

标签: python numpy multidimensional-array scipy mathematical-morphology


【解决方案1】:

如果是 8 个连通的邻域,我认为结果是 8。代码如下:

import numpy
a = numpy.zeros((6,6), dtype=numpy.int)
a[1,2] = a[1,3] = 1
a[4,4] = a[5,4] = a[4,3] = 1

from scipy.ndimage import convolve

kernel = np.ones((3, 3))
kernel[1, 1] = 0
b = convolve(a, kernel, mode="constant")
b[a != 0].sum()

但你说的是车的情况。

编辑

这里是 4-connected 邻域的代码:

import numpy as np
a = np.zeros((6,6), dtype=np.int)
a[1,2] = a[1,3] = 1
a[4,4] = a[5,4] = a[4,3] = 1

from scipy import ndimage
kernel = ndimage.generate_binary_structure(2, 1)
kernel[1, 1] = 0

b = convolve(a, kernel, mode="constant")
b[a != 0].sum()

【讨论】:

  • 抱歉造成误会。我想知道一个简单的 4x4 社区(所以没有对角线连接,例如左、右、上、下)。我在上面编辑了我的问题,因为正确答案确实是 6 而不是 8 (下半部分相等的邻居总数为 4)
  • 我试图改编你的例子,但似乎没那么容易...s = ndimage.generate_binary_structure(2,2) s[0,0] = s[0,2] = s[2,0] = s[2,2] = 0 b = ndimage.convolve(a, s, mode="constant") b[a != 0].sum() # equals 11
  • 哇,这就是诀窍。忘记更换中心单元...谢谢!
猜你喜欢
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多