2017-12-21 9 views
-1

pythonの新しい記事です。配列内のユニークなフィーチャにラベルを付けてグループ化する方法

a = [0,0,1,1,0,0,1,1,2,2,3,3,4,4,0,0] 

私はラベルと連続して発生し、ユニークな値、すなわち、同一の同じラベルを割り当てられる連続して発生要素とそうでない場合は異なるラベルを持つによるアレイをスライスしたい:私は、次の例の配列を持っています。これは、scipy.ndimage.labelのように、異なるラベルを割り当てるためにzerosで区切る必要なしに行う必要があります。

はこのように、scipy.ndimage.labelとの出力は、私が期待するものではありません。

lbl = label(a) 
lbl = [0,0,1,1,0,0,2,2,2,2,2,2,2,2,0,0] 

あなたが見ることができるように、それは1つのラベルの代わりに、4つの固有のラベルとして[...,1,1,2,2,3,3,4,4,...]の全配列を組み合わせます。

lbl = [0,0,1,1,0,0,2,2,3,3,4,4,5,5,0,0] 

iが機能して何かを逃したか、これを行うには、他の方法があります持っている:私は何をしたいのに対し、このようなものでしょうか?

+0

私の理解に基づいて明確にするために編集されました。必要に応じてさらに編集してください。 – Divakar

答えて

0

アプローチ#1:は、ここに1つのアプローチだ -

def label_based_on_shifts(a): 
    # Detect starts of each label(element is non-zero and is different 
    # from the previous element) 
    mask = np.r_[a[0]!=0,(a[1:] != a[:-1]) & (a[1:] !=0)] 

    # Setup id array, which when cumulatively summed would lead us to 
    # labelled islands 
    out = mask.astype(np.uint64).cumsum()  

    # Set the islands that are zeros in input array to be zeros in o/p too 
    out[a==0] = 0 
    return out 

サンプルの実行 -

In [53]: a 
Out[53]: array([0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 0, 0]) 

In [54]: label_based_on_shifts(a) 
Out[54]: array([0, 0, 1, 1, 0, 0, 2, 2, 3, 3, 4, 4, 5, 5, 0, 0]) 

アプローチ#2:置き換えるためにもう1 np.cumsumnp.repeat -

def label_based_on_shifts_v2(a): 
    mask = np.r_[True,(a[1:] != a[:-1]),True] 
    idx = np.flatnonzero(mask) 

    valid_idx_mask = a[idx[:-1]]!=0 
    starts = idx[:-1][valid_idx_mask] 
    stops = idx[1:][valid_idx_mask] 
    lens = stops-starts 

    out = np.zeros(len(a), dtype=int) 
    out[a!=0] = np.repeat(np.arange(1,len(starts)+1), lens) 
    return out 
関連する問題