gpt4 book ai didi

python - 从 Python 列表中有效地删除非常接近的重复项

转载 作者:太空狗 更新时间:2023-10-30 02:21:00 25 4
gpt4 key购买 nike

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

问题:
从潜在的文件中删除非常接近的重复项的最有效方法是什么非常大的数据集?

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

提前感谢您的任何建议!如果您有任何需要澄清的地方,或者当然,如果我忽略了一些非常简单的事情(我可能正处于过度思考的地步),请告诉我。

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

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

最佳答案

如果您要处理大量数据,您确实需要使用 NumPy。这是我的做法:

导入 NumPy:

import numpy as np

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

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

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

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

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

no_duplicates = a[unique]

关于python - 从 Python 列表中有效地删除非常接近的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18802563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com