2017-12-21 37 views
-1

python을 처음 사용하는 경우 여기에서배열의 고유 한 피쳐에 라벨을 지정하고 그룹화하는 방법

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

내가 라벨과 연속적으로 발생하는 고유 값, 즉 동일한 동일한 라벨을 할당한다 연속 발생 소자와 달리 다른 레이블에 따른 어레이 슬라이스 할 : I는 다음의 예시적인 배열을 가지고 . 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,1,2,2,3,3,4,4,...]의 전체 순서를 결합했다. 내가 원하는 것은 다음과 같습니다 :

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

기능이 없거나 다른 방법이 있습니까?

+0

제 이해에 기초하여 명확하게 편집되었습니다. 필요한 경우 추가로 편집하십시오. – Divakar

답변

0

접근 방법 # 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 : 대체 할 또 하나 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