关于重复项:Numpy删除重复的行

 2021-04-19 

Numpy delete repeated rows

我只需要删除数组中重复的行,但要保留其中的一行,就不能使用unique,因为我需要保持顺序。
例子

1
2
3
4
5
6
7
8
9
1 a234 125
1 a123 265
1 a234 125
1 a145 167
1 a234 125    
2 a189 547
2 a189 547    
3 a678 567
3 a357 569

我需要此输出

1
2
3
4
5
6
1 a234 125
1 a123 265
1 a145 167    
2 a189 547
3 a678 567
3 a357 569


我认为这可以满足您的要求,并且将np.uniquereturn_index关键字参数一起使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np

a = np.array([[1, 'a234', 125],
              [2, 'b189', 547],
              [1, 'a234', 125],
              [3, 'c678', 567],
              [1, 'a234', 125],
              [2, 'b189', 547]])

b = a.ravel().view(np.dtype((np.void, a.dtype.itemsize*a.shape[1])))
_, unique_idx = np.unique(b, return_index=True)

new_a = a[np.sort(unique_idx)]

>>> new_a
array([['1', 'a234', '125'],
       ['2', 'b189', '547'],
       ['3', 'c678', '567']],
      dtype='|S4')

最讨厌的部分是视图b,该视图将每一行变成np.void dtype的单个元素,以便可以通过np.unique比较完整的行是否相等。