【发布时间】:2012-10-12 18:02:52
【问题描述】:
这是来自solution 的后续问题。 除非数组中有多个补丁,否则计算相邻单元格的解决方案效果很好。
所以这次数组看起来像这样。
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]
【问题讨论】:
-
你得到的是不重叠的单元格?您是否真的希望每个补丁都单独使用它们? IE。如果您将
a[1,3:5] = 1添加到您的a,您甚至想要什么? -
查看其他问题的答案。上面的数组 a 只是一个例子。我的真实数组非常大,包含许多值的单元格补丁
-
我很困惑,因为您表示
scipy.signal.convolve2d解决了您之前的问题——但这会计算所有重叠值。现在看来您希望不 计算重叠,except 当这些重叠来自1s 的非连续块时。那是完全不同的要求。所以你之前的问题并不能真正帮助解释你现在想要什么。 -
真的很大意味着你有很多补丁或大补丁吗?如果他们很少,我认为我的解决方案应该很好用
-
哦,对不起,当时我计算了重叠单元格的数量,这也是最初的问题。因此,这是正确的答案。不,我想用数组中的多个值块计算不重叠的相邻单元格。巨大的意思是数组很大,有很多不同的结构化补丁
标签: python multidimensional-array numpy scipy