6

我有一个这样的数据集:

[[0,1],
 [0,2],
 [0,3],
 [0,4],
 [1,5],
 [1,6],
 [1,7],
 [2,8],
 [2,9]]

我需要删除第一列定义的数据的每个子视图的第一个元素。因此,首先我获取第一列中所有为 0 的元素,然后删除第一行:[0,1]。然后我在第一列中获取元素为 1 并删除第一行 [1,5],下一步我删除 [2,8] 等等。最后,我想要一个这样的数据集:

[[0,2],
 [0,3],
 [0,4],
 [1,6],
 [1,7],
 [2,9]]

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

4

5 回答 5

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)

(上面被编辑以合并@Jaime的解决方案,这是我为后代着想的原始掩蔽解决方案)

m = np.ones(len(a), dtype=bool)
m[i] = False
b = a[m]

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

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
于 2013-03-29T15:22:17.643 回答
2

传入您的列表和要检查值的键。

def getsubset(set, index):
    hash = {}
    for list in set:
        if not list[index] in hash:
            set.remove(list)
            hash[list[index]]  = list

    return set
于 2013-03-29T15:09:38.550 回答
1

您想使用itertools.groupby()一些itertools.islice()and itertools.chain

from itertools import islice, chain, groupby
from operator import itemgetter

list(chain.from_iterable(islice(group, 1, None)
                         for key, group in groupby(inputlist, key=itemgetter(0))))
  • groupby()调用将输入列表分组为第一项相同的块(itemgetter(0)是分组键)。
  • islice(group, 1, None)调用将组转换为将跳过第一个元素的可迭代对象。
  • chain.from_iterable()调用获取每个islice()结果并将它们链接在一起成为一个新的可迭代对象,该可迭代对象list()又变成一个列表。

演示:

>>> list(chain.from_iterable(islice(group, 1, None) for key, group in groupby(inputlist, key=itemgetter(0))))
[[0, 2], [0, 3], [0, 4], [1, 6], [1, 7], [2, 9]]
于 2013-03-29T14:54:10.740 回答
0
a = [[0,1],
 [0,2],
 [0,3],
 [0,4],
 [1,5],
 [1,6],
 [1,7],
 [2,8],
 [2,9]]

a = [y for x in itertools.groupby(a, lambda x: x[0]) for y in list(x[1])[1:]]

print a
于 2013-03-29T14:54:32.813 回答
0

我的回答是:

from operator import itemgetter
sorted(l, key=itemgetter(1))  # fist sort by fist element of inner list 
nl = []
[[0, 1], [0, 2], [0, 3], [0, 4], [1, 5], [1, 6], [1, 7], [2, 8], [2, 9]]
j = 0;
for i in range(len(l)): 
    if(j == l[i][0]):
        j = j + 1   # skip element 
    else:
        nl.append(l[i])  # otherwise append  in new list

输出是:

>>> nl
[[0, 2], [0, 3], [0, 4], [1, 6], [1, 7], [2, 9]]
于 2013-03-29T15:01:02.533 回答