5

背景
我的Python程序处理的数据量比较大,可以在程序内生成,也可以导入。然后处理数据,在其中一个过程中,故意复制数据,然后对其进行操作,清除重复项,然后将其返回给程序以供进一步使用。我正在处理的数据非常精确(最多小数点后 16 位),并且将这种精度保持在至少 14dp 是至关重要的。然而,数学运算当然可以在我的浮点数中返回细微的变化,这样两个值与 14dp 相同,但可能与 16dp 略有不同,因此意味着内置set()函数没有正确删除这样的“重复”(我使用这种方法来原型化这个想法,但对于完成的程序来说并不令人满意)。我还应该指出,我很可能忽略了一些简单的事情!我只是想看看其他人想出什么:)

问题:
从可能非常大的数据集中删除非常接近重复的最有效方法是什么?

我的尝试
我尝试将值本身四舍五入到 14dp,但这当然不能令人满意,因为这会导致更大的错误。我有这个问题的潜在解决方案,但我不相信它尽可能高效或“pythonic”。我的尝试涉及查找与 x dp 匹配的列表条目的索引,然后删除其中一个匹配的条目。

提前感谢您的任何建议!请让我知道您是否希望澄清任何事情,或者当然,如果我忽略了一些非常简单的事情(我可能正处于过度思考的地步)。

澄清“重复”
我的“重复”条目之一的示例:603.73066958946424、603.73066958946460,解决方案将删除这些值之一。

关于 decimal.Decimal 的注意事项:
如果保证所有导入的数据都没有一些接近重复的内容(它经常这样做),这可能会起作用。

4

2 回答 2

5

如果您要处理大量数据,您真的很想使用 NumPy。这是我的做法:

导入 NumPy:

import numpy as np

生成 8000 个高精度浮点数(128 位足以满足您的目的,但请注意,我将 64 位输出转换random为 128 只是为了伪造它。在此处使用您的真实数据。):

a = np.float128(np.random.random((8000,)))

查找舍入数组中唯一元素的索引:

_, unique = np.unique(a.round(decimals=14), return_index=True)

并从原始(非舍入)数组中获取这些索引:

no_duplicates = a[unique]
于 2013-09-14T14:23:35.227 回答
3

为什么不创建一个 dict 将 14dp 值映射到相应的完整 16dp 值:

d = collections.defaultdict(list)

for x in l:
    d[round(x, 14)].append(x)

现在,如果您只想要“唯一”(根据您的定义)值,您可以这样做

unique = [v[0] for v in d.values()]
于 2013-09-14T14:14:32.307 回答