5

背景:
私の Python プログラムは、プログラム内で生成したり、インポートしたりできる比較的大量のデータを処理します。次にデータが処理され、これらのプロセスのいずれかで、データが意図的にコピーされてから操作され、重複がないか消去されてから、さらに使用するためにプログラムに戻されます。私が扱っているデータは非常に正確 (小数点以下 16 桁まで) であり、この精度を少なくとも 14 dp に維持することが不可欠です。ただし、数学演算はもちろん、2 つの値が 14 dp と同じであるが、16 dp とはわずかに異なる可能性があるため、組み込みのset()関数はそのような「重複」を正しく削除しません (私はこの方法を使用してアイデアのプロトタイプを作成しましたが、完成したプログラムには満足のいくものではありません)。また、単純なことを見落としている可能性があることも指摘しておく必要があります。他の人が何を考え出すのか興味があります :)

質問:
非常に大きな可能性のあるデータセットからほぼ重複しているデータを削除する最も効率的な方法は何ですか?

私の試み:
値自体を 14 dp に丸めてみましたが、これはもちろん満足のいくものではありません。この問題に対する潜在的な解決策がありますが、それが可能な限り効率的または「pythonic」であるとは確信していません。私の試みには、x dp に一致するリスト エントリのインデックスを見つけてから、一致するエントリの 1 つを削除することが含まれます。

アドバイスをよろしくお願いします!明確にしたいことがある場合、またはもちろん、非常に単純なことを見落としている場合はお知らせください(考えすぎている可能性があります)。

「重複」の説明:
「重複」エントリの例: 603.73066958946424、603.73066958946460、ソリューションはこれらの値のいずれかを削除します。

decimal.Decimal に関する注意:これは、インポートさ
れたすべてのデータにほぼ重複がないことが保証されている場合に機能します (よくあることです)。

4

2 に答える 2

5

You really want to use NumPy if you're handling large quantities of data. Here's how I would do it :

Import NumPy :

import numpy as np

Generate 8000 high-precision floats (128-bits will be enough for your purposes, but note that I'm converting the 64-bits output of random to 128 just to fake it. Use your real data here.) :

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

Find the indexes of the unique elements in the rounded array :

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

And take those indexes from the original (non-rounded) array :

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

14 dp 値を対応する完全な 16 dp 値にマップする dict を作成してみませんか。

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 に答える