2016-04-28 166 views
0

我有一個由1和零組成的大型3d numpy數組。我想使用scipy.ndimage.label工具來標記每個子數組(2d)中的特徵。標籤3d numpy數組與scipy.ndimage.label

的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二維數組。

+1

我認爲你需要指定'structure'值,給出1d的2d陣列,而不是像默認假定的那樣的3d陣列 –

+0

當我定義2d結構時,如: [[0,1,0], [1,1,1], [0,1,0]] 我得到的錯誤:結構和輸入必須具有相同的排名 –

+1

你需要2D結構爲3D,即其中一個DIMS的長度應爲1. –

回答

0

我在丹曼的幫助下回答了這個問題。

我不得不定義標籤工具全新的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)