2016-06-15 2 views
1

서로 뒤 따르는 중복을 제거하고 싶지만 전체 배열과 중복되지는 않습니다. 또한 주문을 변경하지 않고 유지하고 싶습니다. 입력이 [0 0 1 3 2 2 3 3] 경우numpy 배열에서 다음 중복 제거

그래서 출력은 내가 itertools.groupby()를 사용하는 방법을 발견 [0 1 3 2 3]

해야하지만 빠른 numpy 솔루션을 찾고 있어요. NumPy와 배열을 사용하여 순수 파이썬 느릅 나무에 대한

답변

3
a[np.insert(np.diff(a).astype(np.bool),0,True)] 
Out[99]: array([0, 1, 3, 2, 3]) 

일반적인 생각은 diff을 사용하여 배열의 두 연속 요소 간의 차이를 찾는 것입니다. 그렇다면 non-zero 개의 요소를 색인하는 색인 ​​만 만듭니다. 그러나 diff의 길이는 1 깁니다. 색인을 생성하기 전에 diff 배열의 시작 부분에 insertTrue이 필요합니다.

설명 :

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

In [101]: diff = np.diff(a).astype(np.bool) 

In [102]: diff 
Out[102]: array([False, True, True, True, False, True, False], dtype=bool) 

In [103]: idx = np.insert(diff, 0, True) 

In [104]: idx 
Out[104]: array([ True, False, True, True, True, False, True, False], dtype=bool) 

In [105]: a[idx] 
Out[105]: array([0, 1, 3, 2, 3]) 
0

도 작동이 :

def modify(l): 
    last = None 
    for e in l: 
     if e != last: 
      yield e 

     last = e 

pure = modify([0, 0, 1, 3, 2, 2, 3, 3]) 

import numpy 
num = numpy.array(modify(numpy.array([0, 0, 1, 3, 2, 2, 3, 3]))) 

어떤 NumPy와 기능이 속도를 높일 것 느릅 나무가 있는지 모르겠어요.