選択したポイントのX%をランダムにサブセット化する方法は?


15

選択したポイントをランダムにサブセット化するためにArcGIS 10.2で使用できる方法。たとえば、添付のスクリーンショットでは、選択したポイントの20%を保持し、残りを削除することに興味があります。

ここに画像の説明を入力してください


レイヤーからランダムなポイントを選択するデフォルトの方法はないと思います。Pythonスクリプトで試しましたか?またはアドイン?
マーチンD

回答:


26

以下は、現在の選択を無視して、パーセントに基づいてレイヤー内のランダムフィーチャを選択するpython関数です。

def SelectRandomByPercent (layer, percent):
    #layer variable is the layer name in TOC
    #percent is percent as whole number  (0-100)
    if percent > 100:
        print "percent is greater than 100"
        return
    if percent < 0:
        print "percent is less than zero"
        return
    import random
    fc = arcpy.Describe (layer).catalogPath
    featureCount = float (arcpy.GetCount_management (fc).getOutput (0))
    count = int (featureCount * float (percent) / float (100))
    if not count:
        arcpy.SelectLayerByAttribute_management (layer, "CLEAR_SELECTION")
        return
    oids = [oid for oid, in arcpy.da.SearchCursor (fc, "OID@")]
    oidFldName = arcpy.Describe (layer).OIDFieldName
    path = arcpy.Describe (layer).path
    delimOidFld = arcpy.AddFieldDelimiters (path, oidFldName)
    randOids = random.sample (oids, count)
    oidsStr = ", ".join (map (str, randOids))
    sql = "{0} IN ({1})".format (delimOidFld, oidsStr)
    arcpy.SelectLayerByAttribute_management (layer, "", sql)

これをコピーして、ArcMapのPythonシェルに貼り付けます。

次に、シェルタイプSelectRandomByPercent ("layer", num)で、layerはレイヤーの名前でnumあり、パーセントの整数です。

ランダム選択

要求されたサブセット選択を見つけるためのバリエーション:

def SelectRandomByPercent (layer, percent):
    #layer variable is the layer name in TOC
    #percent is percent as whole number  (0-100)
    if percent > 100:
        print "percent is greater than 100"
        return
    if percent < 0:
        print "percent is less than zero"
        return
    import random
    featureCount = float (arcpy.GetCount_management (layer).getOutput (0))
    count = int (featureCount * float (percent) / float (100))
    if not count:
        arcpy.SelectLayerByAttribute_management (layer, "CLEAR_SELECTION")
        return
    oids = [oid for oid, in arcpy.da.SearchCursor (layer, "OID@")]
    oidFldName = arcpy.Describe (layer).OIDFieldName
    path = arcpy.Describe (layer).path
    delimOidFld = arcpy.AddFieldDelimiters (path, oidFldName)
    randOids = random.sample (oids, count)
    oidsStr = ", ".join (map (str, randOids))
    sql = "{0} IN ({1})".format (delimOidFld, oidsStr)
    arcpy.SelectLayerByAttribute_management (layer, "", sql)

最後に、パーセントではなくカウントでレイヤーを選択するもう1つのバリエーション:

def SelectRandomByCount (layer, count):
    import random
    layerCount = int (arcpy.GetCount_management (layer).getOutput (0))
    if layerCount < count:
        print "input count is greater than layer count"
        return
    oids = [oid for oid, in arcpy.da.SearchCursor (layer, "OID@")]
    oidFldName = arcpy.Describe (layer).OIDFieldName
    path = arcpy.Describe (layer).path
    delimOidFld = arcpy.AddFieldDelimiters (path, oidFldName)
    randOids = random.sample (oids, count)
    oidsStr = ", ".join (map (str, randOids))
    sql = "{0} IN ({1})".format (delimOidFld, oidsStr)
    arcpy.SelectLayerByAttribute_management (layer, "", sql)

のいい使い方random.sample()
アーロン

ありがとう、アーロン。最初にエクスポートせずにサブセット選択の回答を更新しました。
エミールブランデー

+1。sqlパラメーターの文字列の長さに既知の制限はありますか?
ポール

@Paulこのコードをテストして、ほぼ400万個の機能を持つレイヤーで機能の100%を選択したところ、メモリエラーが発生しました。したがって、厳密な文字列制限はないように見えますが、メモリに依存しています。私はここについてブログましOracleのSDEのデータベースのためのSQLアイテムの制限もあります:emilsarcpython.blogspot.com/2015/10/...は
エミル・ブランデージ

1
Esriはブログでこのコードを使用しましたsupport.esri.com/en/technical-article/000013141
Emil Brundage

13

通常、blah238で説明されている空間エコロジーツールの使用もお勧めします。

ただし、試すことができる別の方法は、Randomという属性を追加して乱数を保存することです。 ここに画像の説明を入力してください

次に、Pythonパーサーでその属性のフィールド計算機を使用して、次のコードブロックを使用します。

import random
def rand():
  return random.random()

下の画像をご覧ください:

これにより、0〜1のランダムな値が作成されます。その後、フィーチャの20%を選択する場合、ランダム値が0.2未満のフィーチャを選択できます。もちろん、これは多くの機能でうまく機能します。テストとして7つのフィーチャのみを含むフィーチャクラスを作成しましたが、0.2未満の値はありませんでした。ただし、多くの機能があるように見えるので、それは問題ではありません。

ここに画像の説明を入力してください


7
このメソッドは、平均して機能の20%を返しますが、場合によってはこれが優先されます。ただし、毎回20%が必要な場合は、提案どおりに実行し、ランダム値で機能を並べ替えて、最初の20%を選択できます。
Llaves

Esriはこのプロセスをブログで使用しました:support.esri.com/en/technical-article/000013141
Emil Brundage

6

また、ArcGIS Desktopで使用可能な@StephenLeadのランダムなスクリプトで選択する以前の機能もあります。書かれたと思うが、ArcGIS 9.xでは2008年に最後に修正されたが、2010年頃に10.0でそれを使用し、それでもうまくいった。


5

Hawthのツールを試すことができます:http : //www.spatialecology.com/htools/rndsel.php

既存の選択は​​尊重されないため、最初に既存の選択からフィーチャレイヤーを作成する必要があることに注意してください。


残念ながら、そのバージョンはArcGIS 9.3以降と互換性がありません。現在、地理空間モデリング環境と呼ばれています:spatialecology.com/gme
kenbuja

良い点は、GMEの同等のコマンドです:spatialecology.com/gme/rsample.htm
blah238

GMEツールセットは、ArcGIS「内の」作業は、むしろそれは、スタンドアロンのツールですいません
ライアン・ガーネット

3

ArcGIS 10の別のランダム選択アドイン、サンプリングデザインツールを次に示します。データセット内のフィーチャの20%を選択できます。ただし、これは、blah238で言及されているHawth's Toolsの制限と同様に、選択セットを使用してランダムに選択することはありません。


0

サブセット機能ツールを使用することもできます。ドキュメントによると:

元のデータセットを2つの部分に分割します。1つは空間構造のモデル化とサーフェスの生成に使用され、もう1つは出力サーフェスの比較と検証に使用されます。

1つの欠点は、Geostatistical Analystエクステンションが必要なことです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.