2016-06-15 54 views
1

我想刪除相互跟隨的重複項,但不會沿整個數組重複。另外我想保持訂購不變。在numpy數組中刪除以下重複項

所以,如果輸入的是[0 0 1 3 2 2 3 3]輸出應該是[0 1 3 2 3]

我找到了一種方法使用itertools.groupby()但是我正在尋找更快的numpy解決方案。

回答

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

總的想法是用diff找出數組中兩個連續元素之間的差異。那麼我們只索引那些給出差異元素的那些。但由於diff的長度縮短了1個。所以在編制索引之前,我們需要將insertTrue添加到diff數組的開頭。

說明:

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

對於純Python至極還與numpy的陣列使用:

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的功能至極將加速此。