2017-12-21 13 views
-1

Neu bei Python hier. Ich habe folgende Beispiel Array:So beschriften und gruppieren Sie einzigartige Features in einem Array

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

Ich möchte, um das Array zu kennzeichnen und in Scheiben schneiden entsprechend eindeutige Werte, die in Folge auftreten, also um identische Elemente, die in Folge auftreten, sind die gleichen Etiketten zugewiesen werden und mit unterschiedlichen Etiketten anders . Dies ist ohne die Notwendigkeit zu tun, durch zeros für die Zuordnung unterschiedlicher Etiketten getrennt zu werden, wie man mit etwas wie scipy.ndimage.label tun würde.

Somit ist der Ausgang mit scipy.ndimage.label ist nicht, was ich erwarten:

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

Wie Sie sehen können, ist es die ganze Folge von [...,1,1,2,2,3,3,4,4,...] als ein Etikett anstelle von vier eindeutigen Markierungen kombiniert. Während das, was ich will, ist dies so etwas wie:

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

habe ich verpasst etwas mit der Funktion oder gibt es eine andere Möglichkeit, dies zu tun?

+0

Bearbeitet, um es auf der Grundlage meines Verständnisses klarzustellen. Fühlen Sie sich frei, bei Bedarf weiter zu bearbeiten. – Divakar

Antwort

0

Ansatz # 1: Hier ist ein Ansatz -

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 

Probelauf -

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]) 

Ansatz # 2: Ein weiterer np.cumsum mit np.repeat zu ersetzen -

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 
Verwandte Themen