根据 2 列值取 numpy 数组的唯一值。

Kru*_*mar 2 python arrays numpy

我在 python 中有两列的 Numpy 数组,如下所示:

time,id
1,a
2,b
3,a
1,a
5,c
6,b
3,a
Run Code Online (Sandbox Code Playgroud)

我想占用每个用户的独特时间。对于上述数据,我想要低于输出。

time,id
1,a
2,b
3,a
5,c
6,b
Run Code Online (Sandbox Code Playgroud)

也就是说,我只想取唯一的行。所以, 1,a 和 3,a 不会在结果中重复。我将列作为字符串数据类型并有一个非常大的二维数组。一个解决方案可能是,我可以遍历所有行并制作一组。但这会很慢。请提出一种有效的方法来实现它。

daw*_*awg 5

鉴于:

>>> b
[['1' 'a']
 ['2' 'b']
 ['3' 'a']
 ['1' 'a']
 ['5' 'c']
 ['6' 'b']
 ['3' 'a']]
Run Code Online (Sandbox Code Playgroud)

你可以做:

>>> np.vstack({tuple(e) for e in b})
[['3' 'a']
 ['1' 'a']
 ['2' 'b']
 ['6' 'b']
 ['5' 'c']]
Run Code Online (Sandbox Code Playgroud)

因为这是一个集合理解,你失去了原始的顺序。

或者,为了维持秩序,您可以执行以下操作:

>>> c = np.ascontiguousarray(b).view(np.dtype((np.void, b.dtype.itemsize * b.shape[1])))
>>> b[np.unique(c, return_index=True)[1]]
[['1' 'a']
 ['2' 'b']
 ['3' 'a']
 ['5' 'c']
 ['6' 'b']]
Run Code Online (Sandbox Code Playgroud)

或者,如果您可以使用 Pandas,这真的很容易。鉴于以下数据帧:

>>> df
  id  time
0  a     1
1  b     2
2  a     3
3  a     1
4  c     5
5  b     6
6  a     3
Run Code Online (Sandbox Code Playgroud)

只需使用drop_duplicates()

>>> df.drop_duplicates()
  id  time
0  a     1
1  b     2
2  a     3
4  c     5
5  b     6
Run Code Online (Sandbox Code Playgroud)