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中有没有一种有效的方法来做到这一点?
PS 以防万一,我使用下面的代码来查找唯一的数据点集
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]
解决方案
停留在“标准”Python 中,
from collections import Counter
c = Counter(map(tuple, x))
output_data = [list(k) for k, v in c.items() if v == 1]
如果您想知道x
被删除的行的索引 (in )(因为它们有重复项),您可以执行以下操作:
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]]
推荐阅读
- windows - 如何在此 PowerShell 代码中添加异常处理?
- html - Jekyll:点击特定类别并进入新页面后,它没有显示该类别的帖子,而我有一些适合
- c# - 如何通过javascript在c#中第一次播放嵌入式YouTube(使用Gecko浏览器)?
- node.js - 什么是重定向 URI,它应该是什么?
- multithreading - 为什么 c++11 memory_order_relaxed 仍然导致顺序等待?
- flutter - 如何从英雄小部件中删除淡入淡出动画?
- python - python切片索引的默认开始和停止是什么?
- python - 有没有办法在 opencv-python 中显示最后一帧?
- python-3.x - 使用 BeautifulSoup 抓取网页中的 URL
- html - 在 ReactNative View 上设置 flex body 的高度 100%