删除矩阵子视图中的第一个元素

sia*_*mii 6 python numpy

我有这样的数据集:

[[0,1],
 [0,2],
 [0,3],
 [0,4],
 [1,5],
 [1,6],
 [1,7],
 [2,8],
 [2,9]]
Run Code Online (Sandbox Code Playgroud)

我需要删除第一列定义的数据的每个子视图的第一个元素.所以首先我得到第一列中有0的所有元素,并删除第一行:[0,1].然后我在第一列中得到1的元素并删除第一行[1,5],下一步我删除[2,8],依此类推.最后,我想有一个像这样的数据集:

[[0,2],
 [0,3],
 [0,4],
 [1,6],
 [1,7],
 [2,9]]
Run Code Online (Sandbox Code Playgroud)

编辑:这可以在numpy中完成吗?我的数据集非常大,因此所有元素的循环至少需要4分钟才能完成.

ask*_*han 4

根据要求,numpy解决方案:

import numpy as np
a = np.array([[0,1], [0,2], [0,3], [0,4], [1,5], [1,6], [1,7], [2,8], [2,9]])
_,i = np.unique(a[:,0], return_index=True)

b = np.delete(a, i, axis=0)
Run Code Online (Sandbox Code Playgroud)

(上面经过编辑以合并@Jaime的解决方案,这是我为了后代的原始屏蔽解决方案)

m = np.ones(len(a), dtype=bool)
m[i] = False
b = a[m]
Run Code Online (Sandbox Code Playgroud)

有趣的是,面具似乎更快:

In [225]: def rem_del(a):
   .....:     _,i = np.unique(a[:,0], return_index=True)
   .....:     return np.delete(a, i, axis = 0)
   .....: 

In [226]: def rem_mask(a):
   .....:     _,i = np.unique(a[:,0], return_index=True)
   .....:     m = np.ones(len(a), dtype=bool)
   .....:     m[i] = False
   .....:     return a[m]
   .....: 

In [227]: timeit rem_del(a)
10000 loops, best of 3: 181 us per loop

In [228]: timeit rem_mask(a)
10000 loops, best of 3: 59 us per loop
Run Code Online (Sandbox Code Playgroud)