如何删除numpy数组中的相邻重复值?

时间:2016-06-28 01:56:40

标签: python arrays numpy

给定一个numpy数组,我希望删除相邻的重复非零值和所有零值。例如,对于像这样的数组:[0,0,1,1,1,2,2,0,1,3,3,3],我想将其转换为:[1,2,1,3]。你知道怎么做吗?我只知道np.unique(arr)但它会删除所有重复值并保持零值。提前谢谢!

4 个答案:

答案 0 :(得分:4)

您可以使用groupby中的itertools方法结合列表理解来解决此问题:

from itertools import groupby
[k for k,g in groupby(a) if k!=0]

# [1,2,1,3]

数据

a = [0,0,1,1,1,2,2,0,1,3,3,3]

答案 1 :(得分:3)

以这种方式:

In [62]: x
Out[62]: array([0, 0, 1, 1, 1, 2, 2, 0, 1, 3, 3, 3])

In [63]: selection = np.ones(len(x), dtype=bool)

In [64]: selection[1:] = x[1:] != x[:-1]

In [65]: selection &= x != 0

In [66]: x[selection]
Out[66]: array([1, 2, 1, 3])

答案 2 :(得分:1)

import numpy as np
a = np.array([0,0,1,1,1,2,2,0,1,3,3,3])

使用integer indexing选择非零元素

b = a[a.nonzero()]

>>> b
array([1, 1, 1, 2, 2, 1, 3, 3, 3])
>>>

将数组向左移动并在末尾添加一个元素,以将每个元素与其邻居进行比较。使用零,因为您知道b中没有任何内容。

b1 = np.append(b[1:], 0)

>>> b1
array([1, 1, 2, 2, 1, 3, 3, 3, 0])
>>>

使用boolean indexing获取所需的值。

c = b[b != b1]

>>> c
array([1, 2, 1, 3])
>>> 

答案 3 :(得分:0)

>>> import numpy as NP
>>> a = NP.array([0,0,1,1,1,2,2,0,1,3,3,3])

首先,删除零:

>>> idx = a==0
>>> a = a[-idx1]
>>> a
  array([1, 1, 1, 2, 2, 1, 3, 3, 3])

现在删除连续的重复项

请注意 ediff1d(a)& a 具有不同的形状,因此 a1 不是结果; a的主要价值必须预先设定,正如我在下面的最后三行所做的那样)

>>> idx = NP.array(NP.ediff1d(a), dtype=bool)
>>> a1 = a[1:][idx]
  array([2, 1, 3])

创建一个空数组来存储结果

>>> a0 = NP.empty(shape=(a1.shape[0]+1,))
>>> a0[0] = a[0]
>>> a0[1:] = a1
>>> a0
  array([ 1, 2, 1, 3])