我想删除相互跟随的重复项,但不会删除整个数组中的重复项。我还想保持订单不变。
因此,如果输入为[0 0 1 3 2 2 3 3]
,则输出应为[0 1 3 2 3]
我找到了使用itertools.groupby()
的方法,但我正在寻找更快的numpy
解决方案。
答案 0 :(得分:5)
a[np.insert(np.diff(a).astype(np.bool),0,True)]
Out[99]: array([0, 1, 3, 2, 3])
一般的想法是使用diff
来查找数组中两个连续元素之间的差异。然后我们只索引那些给出non-zero
差异元素的东西。但是因为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])
答案 1 :(得分:1)
对于纯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函数可以加快速度。
答案 2 :(得分:0)
对于 NumPy 版本 >= 1.16.0,您可以使用 prepend
参数:
a[np.diff(a, prepend=np.nan).astype(bool)]