1

我有一个由 1 和 0 组成的大型 3d numpy 数组。我想使用 scipy.ndimage.label 工具来标记每个子阵列(2d)中的特征。

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

import numpy as np
from scipy.ndimage import label

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)

任何想法如何解决这个问题?

附言。我试图标记的完整数组由 350219 个二维数组组成。

4

1 回答 1

2

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

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

import numpy as np
from scipy.dimage import label

str_3D = np.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)
于 2016-04-28T15:20:36.733 回答