¿Subconstruir aleatoriamente X% de las funciones seleccionadas usando ArcPy?

14

¿Qué métodos están disponibles en ArcGIS 10.2 para subcontratar aleatoriamente una selección de puntos? Por ejemplo, en la captura de pantalla adjunta, me interesa conservar el 20% de los puntos seleccionados y eliminar el resto.

    
pregunta Aaron 21.11.2013 - 20:58

6 respuestas

24

Aquí hay una función de python que seleccionará características aleatorias en una capa basada en el porcentaje, ignorando la selección actual:

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, "[email protected]")]
    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)

Copie / pegue esto en el shell de python en ArcMap.

Luego, en el tipo de shell SelectRandomByPercent ("layer", num) , donde layer es el nombre de tu capa, y num es un número entero de tu porcentaje.

Unavariaciónparaencontrarunaseleccióndesubconjuntosegúnlosolicitado:

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, "[email protected]")] 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)

Finalmente, una variación más para seleccionar una capa por conteo, en lugar de un porcentaje:

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, "[email protected]")]
    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)
    
respondido por el Emil Brundage 26.10.2015 - 21:00
12

En general, también recomiendo usar las herramientas de ecología espacial como se explica en blah238.

Sin embargo, otro método que podrías probar sería agregar un atributo llamado Aleatorio para almacenar un número aleatorio:

Luego,utilizandolacalculadoradecampoeneseatributo,conelanalizadordePython,useelsiguientebloquedecódigo:

importrandomdefrand():returnrandom.random()

Verimagenacontinuación:

Estocrearávaloresaleatoriosentre0y1.Luego,sideseaseleccionarel20%delasfunciones,puedeseleccionarfuncionesenlasqueelvaloraleatorioseamenorque0.2.Porsupuesto,estofuncionarámejorconmuchascaracterísticas.Creéunaclasedeentidadconsolo7funcionescomopruebaynohubovaloresinferioresa0.2.Sinembargo,parecequetienesmuchascaracterísticas,porloqueesonodeberíaimportar.

    
respondido por el Fezter 22.11.2013 - 00:01
6

También hay un selección de características al azar de @StephenLead disponible para ArcGIS Desktop. Aunque escrito, creo que para ArcGIS 9.x, y que se modificó por última vez en 2008, lo usé aproximadamente en 2010 con 10.0, y aún funcionó bien.

    
respondido por el PolyGeo 21.11.2013 - 23:09
5

Puedes probar las herramientas de Hawth: enlace

Tenga en cuenta que la selección existente no se acepta, por lo que primero tendría que crear una capa de entidades a partir de la selección existente.

    
respondido por el blah238 21.11.2013 - 21:19
3

Aquí hay otro complemento de selección aleatoria para ArcGIS 10, Herramienta de diseño de muestreo . Le permitirá seleccionar el 20% de las funciones en su conjunto de datos. Sin embargo, esto no utiliza un conjunto seleccionado para hacer una selección aleatoria, similar a las restricciones de Hawth's Tools mencionadas por blah238.

    
respondido por el kenbuja 21.11.2013 - 22:38
0

También puede usar Características de subconjunto herramienta. Según la documentación:

  

Divide el conjunto de datos original en dos partes: una parte que se utilizará para   modelar la estructura espacial y producir una superficie, la otra para ser   se utiliza para comparar y validar la superficie de salida.

Una desventaja es que necesita la extensión de Geostatistical Analyst.

    
respondido por el Ernesto561 27.05.2017 - 03:11

Lea otras preguntas en las etiquetas