标签3d numpy数组与scipy.ndimage.label

时间:2016-04-28 14:39:21

标签: python arrays numpy scipy ndimage

我有一个大的3d numpy数组,由1和0组成。我想使用scipy.ndimage.label工具标记每个子数组(2d)中的功能。

3d数组的子集如下所示:

subset=np.array([[[1, 0, 0],
    [1, 0, 1],
    [0, 0, 0]],

   [[0, 0, 0],
    [1, 0, 1],
    [0, 0, 1]],

   [[0, 0, 0],
    [1, 0, 0],
    [0, 1, 1]],

   [[0, 0, 0],
    [1, 0, 0],
    [1, 1, 1]]], dtype=uint8)

当我在该子集的一小部分上使用标签工具时,工作正确:

>>>label(subset[0:3])    
(array([[[1, 0, 0],
    [1, 0, 2],
    [0, 0, 0]],

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

   [[0, 0, 0],
    [1, 0, 0],
    [0, 2, 2]]]), 2)

但是,当我使用整个子集时,标签工具无法正常工作:

>>>label(subset)
(array([[[1, 0, 0],
    [1, 0, 1],
    [0, 0, 0]],

   [[0, 0, 0],
    [1, 0, 1],
    [0, 0, 1]],

   [[0, 0, 0],
    [1, 0, 0],
    [0, 1, 1]],

   [[0, 0, 0],
    [1, 0, 0],
    [1, 1, 1]]]), 1)

有关如何解决此问题的任何想法?

PS。 我想要标记的完整数组包含350219个2d数组。

1 个答案:

答案 0 :(得分:0)

我在dan-man的帮助下回答了这个问题。

我必须为标签工具定义一个新的3D结构:

str_3D=array([[[0, 0, 0],
    [0, 0, 0],
    [0, 0, 0]],

   [[0, 1, 0],
    [1, 1, 1],
    [0, 1, 0]],

   [[0, 0, 0],
    [0, 0, 0],
    [0, 0, 0]]], dtype='uint8')

现在标签为我的子集返回以下内容:

>>> label(subset,structure=str_3D)
# outputs:
(array([[[1, 0, 0],
    [1, 0, 2],
    [0, 0, 0]],

   [[0, 0, 0],
    [3, 0, 4],
    [0, 0, 4]],

   [[0, 0, 0],
    [5, 0, 0],
    [0, 6, 6]],

   [[0, 0, 0],
    [7, 0, 0],
    [7, 7, 7]]]), 7)