我有大小不同的2d二进制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个内部边缘(相邻单元格的值相同)
进一步说明所需的邻域

最佳答案

我认为如果是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连通邻域的代码:

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()

关于python - 计算一个numpy数组中相等的相邻单元格的数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36367531/

10-14 19:01
查看更多