计算 numpy 数组中相等相邻单元格的数量
Calculate number of equal neighbouring cells within a numpy array
我有不同大小的 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
这里 "image" 包含两个补丁,一个有 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 内部边界 returns 错误值 (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()
但你说的是 rook 的情况。
编辑
这里是 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()
我有不同大小的 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
这里 "image" 包含两个补丁,一个有 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 内部边界 returns 错误值 (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()
但你说的是 rook 的情况。
编辑
这里是 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()