完全删除重复的数据而无需维护一个

时间:2018-06-21 04:59:18

标签: python

我发现有几种删除重复数据的方法。 但是,出于显而易见的原因,它们(至少是我发现的)都没有完全删除重复项,而是维护了一个唯一的数据点。 但是,我为模型得出的结论是,这会导致某些错误行为,并且想知道是否有任何方法可以删除重复项的所有候选项。 更清楚地说,例如数据是否如下:

x = [[1, 2, 3, 4],
     [1, 2, 3, 4],
     [5, 2, 1, 4],
     [5, 2, 1, 4],
     [3, 4, 2, 4]]

然后我只想要最后一行[3,4,2,4],其中重复项被完全删除(我正在努力寻找正确的表达式)。 我尝试使用“ for”循环(通过提取非唯一数据并将它们与唯一数据集进行比较,然后也将其删除),但是,我的数据约为50k,这需要太多时间。有没有一种有效的方法可以在python中做到这一点?

P.S。以防万一,我使用下面的代码来找到唯一的数据点集

temp = np.ascontiguousarray(raw_input).view(np.dtype((np.void, raw_input.dtype.itemsize*raw_input.shape[1])))
_, idx = np.unique(temp, return_index = True)
input_data = raw_input[idx] # unique input data
output_data = output_label[idx]

4 个答案:

答案 0 :(得分:4)

使用“标准” Python,

from collections import Counter
c = Counter(map(tuple, x))
output_data = [list(k) for k, v in c.items() if v == 1]

如果您想知道已删除的行的索引(在x中(因为它们具有重复项),可以执行以下操作:

rem = [idx for idx, k in enumerate(x) if c[tuple(k)] > 1]

或者(或最好)使用numpy

u, invidx, cnt = np.unique(x, axis=0, return_inverse=True, return_counts=True)
rem = np.flatnonzero(cnt[invidx] > 1)
output_data = u[cnt == 1]

示例:

In [1]: from collections import Counter

In [2]: x = [[1, 2, 3, 4],
   ...:      [1, 2, 3, 4],
   ...:      [5, 2, 1, 4],
   ...:      [5, 2, 1, 4],
   ...:      [3, 4, 2, 4]]
   ...:      

In [3]: c = Counter(map(tuple, x))

In [4]: output_data = [list(k) for k, v in c.items() if v == 1]

In [5]: print(output_data)
[[3, 4, 2, 4]]

使用numpy的示例:

In [30]: u, invidx, cnt = np.unique(x, axis=0, return_inverse=True,
    ...: return_counts=True)

In [31]: print(u)
[[1 2 3 4]
 [3 4 2 4]
 [5 2 1 4]]

In [32]: print(invidx)
[0 0 2 2 1]

In [33]: print(cnt)
[2 1 2]

In [34]: rem = np.flatnonzero(cnt[invidx] > 1)

In [35]: output_data = u[cnt == 1]

In [36]: print(rem)
[0 1 2 3]

In [37]: print(output_data)
[[3 4 2 4]]

答案 1 :(得分:0)

检查一下

final_list = list(filter(lambda tup:x.count(list(tup))==1, list(set(map(tuple,x)))))
list(map(list,final_list))

答案 2 :(得分:0)

这对您有用吗?:

a=[[1,2],[1,2],[2,3],[3,4],[3,4]]
b=a[:]
for i in range(len(a)-1,0,-1):
    if a[i] == a[i-1]:
        del b[i-1:i+1]

# a == [[1, 2], [1, 2], [2, 3], [3, 4], [3, 4]]
# b == [[2, 3]]

答案 3 :(得分:-1)

也许将数组更改为集合会起作用吗? 一组仅保留唯一值。