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 不会在结果中重复。我将列作为字符串数据类型并有一个非常大的二维数组。一个解决方案可能是,我可以遍历所有行并制作一组。但这会很慢。请提出一种有效的方法来实现它。
鉴于:
>>> 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)