Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to remove the adjacent duplicate value in a numpy array?

Given a numpy array, I wish to remove the adjacent duplicate non-zero value and all the zero value. For instance, for an array like that: [0,0,1,1,1,2,2,0,1,3,3,3], I'd like to transform it to: [1,2,1,3]. Do you know how to do it? I just know np.unique(arr) but it would remove all the duplicate value and keep the zero value. Thank you in advance!

like image 974
user5779223 Avatar asked Jun 28 '16 01:06

user5779223


3 Answers

You can use the groupby method from itertools combined with list comprehension for this problem:

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

# [1,2,1,3]

Data:

a = [0,0,1,1,1,2,2,0,1,3,3,3]
like image 193
Psidom Avatar answered Nov 13 '22 07:11

Psidom


Here's one way:

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])
like image 28
Warren Weckesser Avatar answered Nov 13 '22 08:11

Warren Weckesser


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

Use integer indexing to choose the non-zero elements

b = a[a.nonzero()]

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

Shift the array to the left and add an element to the end to compare each element with its neighbor. Use zero since you know there aren't any in b.

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

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

Use boolean indexing to get the values you want.

c = b[b != b1]

>>> c
array([1, 2, 1, 3])
>>> 
like image 2
wwii Avatar answered Nov 13 '22 07:11

wwii