计算numpy数组中相等的相邻单元格的数量

时间:2016-04-01 23:44:48

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

我有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' s ,所以单元格位于每个单元格的左侧,右侧,下方和上方)包括伪复制(反之亦然)。

内部边界的先前approach返回错误的值(5),因为它旨在计算外边界。

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

因此,对于上述测试数组,正确的总结果将是 6 (上部补丁有两个内部边界,下部四个)。

感谢任何提示!

编辑:

  • 错误:下部显然有4个内部边缘(相邻的单元格具有相同的值)

  • 更多地解释了所需的邻居

1 个答案:

答案 0 :(得分:3)

我认为如果它是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()