Python numpy阵列中多个细胞片的相邻细胞

Python numpy阵列中多个细胞片的相邻细胞,python,multidimensional-array,numpy,scipy,Python,Multidimensional Array,Numpy,Scipy,这是由此产生的后续问题。 除非阵列中有多个面片,否则计算相邻单元数的解决方案非常有效 因此,这一次,例如,数组如下所示 import numpy from scipy import ndimage s = ndimage.generate_binary_structure(2,2) a = numpy.zeros((6,6), dtype=numpy.int) # example array a[1:3, 1:3] = 1;a[2:4,4:5] = 1 print a [0 0 0 0 0 0

这是由此产生的后续问题。 除非阵列中有多个面片,否则计算相邻单元数的解决方案非常有效

因此,这一次,例如,数组如下所示

import numpy
from scipy import ndimage

s = ndimage.generate_binary_structure(2,2)
a = numpy.zeros((6,6), dtype=numpy.int) # example array
a[1:3, 1:3] = 1;a[2:4,4:5] = 1
print a
[0 0 0 0 0 0]
[0 1 1 0 0 0]
[0 1 1 0 1 0]
[0 0 0 0 1 0]
[0 0 0 0 0 0]
[0 0 0 0 0 0]

# Number of nonoverlapping cells
c = ndimage.binary_dilation(a,s).astype(a.dtype)
b = c - a
numpy.sum(b) # returns 19
# However the correct number of non overlapping cells should be 22 (12+10)
有什么聪明的解决方案可以解决这个难题而不使用任何循环或迭代数组?原因是阵列可能相当大

想法1:

仔细考虑一下,一种方法可能是在迭代结构中检查多个补丁。为了使总计数正确,下面的单元格在放大时必须等于2(或更多)。有人知道如何把这个想法变成代码吗

[1 1 1 1 0 0]
[1 0 0 2 1 1]
[1 0 0 2 0 1]
[1 1 1 2 0 1]
[0 0 0 1 1 1]
[0 0 0 0 0 0]

您可以使用
ndimage
中的
label
来分割每个补丁

然后,您只需询问返回数组的位置等于1、2、3等,并对其执行算法(或者您只需使用
ndimage.distance\u transform\u cdt
,但要反转每个标记段的前向/背景

编辑1:

此代码将获取您的数组
a
,并执行您要求的操作:

b, c = ndimage.label(a)
e = numpy.zeros(a.shape)
for i in xrange(c):

    e += ndimage.distance_transform_cdt((b == i + 1) == 0) == 1

print e
我意识到这有点难看,因为所有的人都是平等的,但它输出:

In [41]: print e
[[ 1.  1.  1.  1.  0.  0.]
 [ 1.  0.  0.  2.  1.  1.]
 [ 1.  0.  0.  2.  0.  1.]
 [ 1.  1.  1.  2.  0.  1.]
 [ 0.  0.  0.  1.  1.  1.]
 [ 0.  0.  0.  0.  0.  0.]]
编辑2(替代解决方案):

这段代码应该做同样的事情,并且希望更快(但是它将而不是找到 两个面片仅接触角)


您可以使用
ndimage
中的
label
来分割每个补丁

然后,您只需询问返回数组的位置等于1、2、3等,并对其执行算法(或者您只需使用
ndimage.distance\u transform\u cdt
,但要反转每个标记段的前向/背景

编辑1:

此代码将获取您的数组
a
,并执行您要求的操作:

b, c = ndimage.label(a)
e = numpy.zeros(a.shape)
for i in xrange(c):

    e += ndimage.distance_transform_cdt((b == i + 1) == 0) == 1

print e
我意识到这有点难看,因为所有的人都是平等的,但它输出:

In [41]: print e
[[ 1.  1.  1.  1.  0.  0.]
 [ 1.  0.  0.  2.  1.  1.]
 [ 1.  0.  0.  2.  0.  1.]
 [ 1.  1.  1.  2.  0.  1.]
 [ 0.  0.  0.  1.  1.  1.]
 [ 0.  0.  0.  0.  0.  0.]]
编辑2(替代解决方案):

这段代码应该做同样的事情,并且希望更快(但是它将而不是找到 两个面片仅接触角)



你得到的是不重叠的单元格?你真的希望每个补丁都有单独的单元格吗?例如,如果你添加
a[1,3:5],你会想要什么=1
到您的
a
?请参见另一个问题中的答案。上面的数组a只是一个示例。我的真实数组非常大,包含许多值的单元格补丁。我很困惑,因为您指出
scipy.signal.convolve2d
解决了您以前的问题-但这将计算所有重叠值。现在看来你不想计算重叠,除非这些重叠是由
1
s的非连续块造成的。这是一个完全不同的要求。所以你之前的问题并不能真正帮助解释你现在想要什么。真的很大意味着你有很多补丁或大补丁吗?如果它们很少,我认为我的解决方案应该很有效很抱歉,那时候我计算了重叠单元格的数量,这也是最初的问题。因此这是正确的答案。不,我想计算一个数组中具有多个值补丁的非重叠相邻单元格。巨大意味着数组很大,并且有许多不同的结构化补丁不重叠的单元格是吗?您真的希望每个面片都有单独的单元格吗?例如,如果您添加
a[1,3:5],您会想要什么=1
到您的
a
?请参见另一个问题中的答案。上面的数组a只是一个示例。我的真实数组非常大,包含许多值的单元格补丁。我很困惑,因为您指出
scipy.signal.convolve2d
解决了您以前的问题-但这将计算所有重叠值。现在看来你不想计算重叠,除非这些重叠是由
1
s的非连续块造成的。这是一个完全不同的要求。所以你之前的问题并不能真正帮助解释你现在想要什么。真的很大意味着你有很多补丁或大补丁吗?如果它们很少,我认为我的解决方案应该很有效很抱歉,那时候我计算了重叠单元格的数量,这也是最初的问题。因此这是正确的答案。不,我想计算一个数组中具有多个值补丁的非重叠相邻单元格。巨大意味着数组很大,并且有许多不同的结构化补丁,您需要棋盘设置(默认)关于距离变换btw.mhh,我知道label函数。我只是在阅读
ndimage.distance\u transform\u cdt
的文档。你能提供一个例子说明你的意思吗?我现在的问题是,
numpy.sum
的值计数不能对相邻的单元格进行分片计数是的,这与我想要的完全一样。谢谢。虽然我仍然不知道距离变换cdt的作用:-)距离变换cdt是一个非常好的算法,它可以给出所有非目标位置到目标的距离。距离可以用多种方式测量,棋盘意味着它可以给出国王的移动次数,就像你在下棋一样。这就是为什么我要求返回1的位置。(出租车需要走两个街区才能找到那些拐角(因为它不能走对角线)),如果我在第二个解决方案中设置的限制适合您的应用,那么我认为它应该是一个更快的算法。您需要棋盘设置(默认)关于距离变换btw.mhh,我知道label函数。我只是在阅读
ndimage.distance\u transform\u cdt
的文档。你能提供一个例子说明你的意思吗?我现在的问题是,
numpy.sum
的值计数不能对相邻的单元格进行分片计数是的,这与我想要的完全一样。T