2

poissonこの場合に役立つかどうかわからないため、この質問にタグを付けました。

データのリストからディストリビューション(おそらく最終的には画像としてフォーマットされたもの)を作成する必要があります。

例えば:

data = [1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 10, 10, 10, 22, 30, 30, 35, 46, 58, 59, 59]

データを使用して視覚的な分布を作成できるようにします。たとえば、この場合、範囲は10であり、有効なポイントになるには、各範囲に少なくとも3つのアイテムが必要であると言えます。

このサンプルデータでは、結果は次のようになると思います。

ditribution = [1, 2, 4, 6]

0〜9、10〜19、30〜39、50〜59の範囲に3つ以上のアイテムがあるためです。その結果を使用して、最終的な分布に存在するセクションがセグメント化された(暗い色)画像を生成できます。私が作成しようとしている画像の種類の例を以下に示します。これは、はるかに多くのデータを使用して生成されたものです。今のところ青い線は無視してください。

私は、リスト内のすべてのアイテムを反復処理し、そのように計算を行う力ずくの方法でこれを行う方法を知っています。しかし、私のデータセットには数十万、さらには数百万の数が含まれている可能性があります。私の範囲(10)と必要なアイテム数(3)は、実際の例でははるかに大きくなる可能性があります。

配布画像

助けてくれてありがとう。

4

3 に答える 3

4

dataが常にソートされている場合、コンパクトなアプローチは次のようになります。

import itertools as it

d = [k+1 for k, L in
         ((k, len(list(g))) for k, g in it.groupby(data,key=lambda x:x//10))
     if L>=3]

dataが並べ替えられていない場合、またはわからない場合は、の代わりに、sorted(data)の最初の引数として使用します。itertools.groupbydata

密度の低い/コンパクトなアプローチを好む場合は、もちろんこれを次のように拡張できます。

def divby10(x): return x//10

distribution = []
for k, g in it.groupby(data, key=divby10):
    L = len(list(g))
    if L < 3: continue
    distribution.append(k+1)

いずれの場合も、メカニズムは、最初の引数として渡されたiterable内の各アイテムに対してgroupby渡されたcallableを最初に適用して、各アイテムの「キー」を取得することです。key=同じ「キー」を持つアイテムの連続するグループごとgroupbyに、キーの値と、そのグループ内のすべてのアイテムに対して反復可能な2つのアイテムを持つタプルが生成されます。

ここで、キーはアイテムを10で除算することによって取得されます(切り捨てあり)。len(list(g))その「キー」を持つ連続したアイテムの数です。アイテムは連続している必要があるため、データを並べ替える必要があります(また、「値を10で割って切り捨てて」並べ替えるよりも、データを並べ替える方が簡単です;-)。

于 2010-08-23T18:18:15.600 に答える
4

data非常に長い可能性があるため、numpyの使用を検討することをお勧めします。数値計算に役立つ多くの関数を提供し、Pythonリスト[*]よりもnumpy配列に格納するために必要なメモリが少なくて済みますdata。また、numpy関数の多くは内部でC関数を呼び出すため、ある程度の速度を得ることができる場合があります。利益:

import numpy as np

data = np.array([1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 10, 10, 10, 22, 30, 30, 35, 46, 58, 59, 59])

hist,bins=np.histogram(data,bins=np.linspace(0,60,7))
print(hist)
# [11  3  1  3  1  3]

distribution=np.where(hist>=3)[0]+1
print(distribution)
# [1 2 4 6]

[*]-注:上記のコードでは、を定義する過程でPythonリストが作成されましたdata。したがって、ここでの最大メモリ要件は、Pythonリストを使用した場合よりも実際には大きくなります。ただし、Pythonリストへの参照が他にない場合は、メモリを解放する必要があります。または、データがディスクに保存されている場合は、データをnumpy.loadtxt直接numpy配列に読み込むために使用できます。

于 2010-08-23T20:23:02.523 に答える
0

これは、ある種のヒストグラムの仕事のように聞こえます。これを実現するために、事前ソートは必要ありません。ここでは、バケットソートのバリアントを使用して近くの要素をグループ化する方法について説明しますが、目的に合わせてこのアルゴリズムを調整する必要があります。ヒストグラムを作成するために、数値自体をバケットに格納する必要がないことに注意してください

于 2010-08-23T18:35:08.037 に答える