我想刪除相互跟隨的重複項,但不會沿整個數組重複。另外我想保持訂購不變。在numpy數組中刪除以下重複項
所以,如果輸入的是[0 0 1 3 2 2 3 3]
輸出應該是[0 1 3 2 3]
我找到了一種方法使用itertools.groupby()
但是我正在尋找更快的numpy
解決方案。
我想刪除相互跟隨的重複項,但不會沿整個數組重複。另外我想保持訂購不變。在numpy數組中刪除以下重複項
所以,如果輸入的是[0 0 1 3 2 2 3 3]
輸出應該是[0 1 3 2 3]
我找到了一種方法使用itertools.groupby()
但是我正在尋找更快的numpy
解決方案。
a[np.insert(np.diff(a).astype(np.bool),0,True)]
Out[99]: array([0, 1, 3, 2, 3])
總的想法是用diff
找出數組中兩個連續元素之間的差異。那麼我們只索引那些給出差異元素的那些。但由於diff
的長度縮短了1個。所以在編制索引之前,我們需要將insert
的True
添加到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])
對於純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的功能至極將加速此。