删除numpy数组中的以下重复项

时间:2016-06-15 15:38:50

标签: python numpy

我想删除相互跟随的重复项,但不会删除整个数组中的重复项。我还想保持订单不变。

因此,如果输入为[0 0 1 3 2 2 3 3],则输出应为[0 1 3 2 3]

我找到了使用itertools.groupby()的方法,但我正在寻找更快的numpy解决方案。

3 个答案:

答案 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)]