1

2 次元の離散空間データがあります。このデータの空間境界を概算して、その上に別のデータセットを含むプロットを作成したいと思います。

理想的には、これは、matplotlib が plt.Polygon() パッチでプロットできる (x,y) ポイントの順序付けられたセットになります。

私の最初の試みは非常に洗練されていません。データの上に細かいグリッドを配置し、データがセル内にある場合は、そのセルの正方形の matplotlib パッチを作成します。したがって、境界の解像度は、グリッドのサンプリング周波数に依存します。以下に例を示します。グレーの領域はデータを含むセルであり、データが存在しないセルは黒です。

最初の試み http://astro.dur.ac.uk/~dmurphy/data_limits.png

OK、問題は解決しました - なぜ私はまだここにいるのですか? うーん....もっと「エレガントな」ソリューション、または少なくとも1つ高速なソリューションが欲しいです(つまり、「実際の」作業を続けたくありません。これを楽しみたいです!)。私が考えることができる最良の方法は、レイトレーシングのアプローチです-例:

  1. xmin から xmax まで、y=ymin で、データ境界が間隔 dx で交差したかどうかを確認します
  2. y=ymin+dy, do 1
  3. 1-2 を実行しますが、今度は y でサンプリングします

別の方法は、中心を定義し、r-シータ空間でサンプリングすることです。つまり、dシータの増分で放射状のスポークを使用します。

どちらも (x,y) ポイントのセットを生成しますが、隣接するポイントを順序付け/リンクして境界を作成するにはどうすればよいですか?

最近接アプローチは適切ではありません。たとえば、(Geography から借りるために) 地峡 (N&S America を接続するパナマを考えてください) が地域を閉鎖して孤立させる可能性があるためです。これはまた、別の plt.Polygon として表現したいデータに見られる穴をうまく処理できない可能性があります。

解決策は、おそらく面積最大化問題を解くことから得られます。データ範囲を定義する一連のポイントについて、これらのポイント内に含まれる最大連続エリアは? 囲まれたエリアを形成するために、n 番目のポイントの隣接ポイントは? このスキームでは、穴はどのように扱われますか? これは現在、トポロジーに誤りがありますか?

申し訳ありませんが、これの多くは私が大声で考えていることです。ヒント、提案、または解決策を教えていただければ幸いです。これは、多くのソリューション手法でよく研究されている問題だと思いますが、コーディングが簡単で、すぐに実行できるものを探しています...誰もが本当にそうだと思います!

~~~~~~~~~~~~~~~~~~~~~~~~~

マークの凸包のアイデアを使用した試み #2 を 次に示します。代替テキスト http://astro.dur.ac.uk/~dmurphy/data_limitsv2.png

このために、qhull パッケージの qconvex を使用して、極端な頂点を返すようにしました。興味のある方へ:

猫 [データ] | qconvex Fx > out

境界のサンプリングはかなり低いようで、設定をあまりいじっていませんが、忠実度を改善できるとは確信していません。

4

2 に答える 2

2

あなたが探しているのは、データの凸包だと思います。これは、接続されている場合、すべてのポイントが接続されたポイント上または内部にあることを意味する一連のポイントを提供します

于 2010-05-18T10:13:54.000 に答える
0

私は何かを混ぜたかもしれませんが、x と y のレベルの最大値と最小値を単純に決定しない理由は何ですか? 膨大な量のデータがない限り、最小レベルと最大レベルをかなり迅速に決定するポイントを単純に繰り返すことができます。

これは最も効率的な例ではありませんが、データ セットが小さい場合、特に遅くはありません。

import random
data = [(random.randint(-100, 100), random.randint(-100, 100)) for i in range(1000)]

x_min = min([point[0] for point in data])
x_max = max([point[0] for point in data])

y_min = min([point[1] for point in data])
y_max = max([point[1] for point in data])
于 2010-05-19T03:06:25.553 に答える