¿Cómo subconjunto al azar X% de puntos seleccionados?

15

Qué métodos están disponibles en ArcGIS 10.2 para subconjugar 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.

ingrese la descripción de la imagen aquí

Aaron
fuente
Bueno, no creo que haya un método predeterminado para seleccionar puntos aleatorios de la capa. ¿Intentaste con Python Script? O complemento?
Marcin D el

Respuestas:

26

Aquí hay una función de Python que seleccionará entidades aleatorias en una capa en función del 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, "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)

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

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

Selección aleatoria

Una variación para encontrar una selección de subconjunto como se le preguntó:

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)

Finalmente, una variación más para seleccionar una capa por un 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, "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)
Emil Brundage
fuente
Buen uso de random.sample().
Aaron
Gracias @ Aaron. Actualicé la respuesta para una selección de subconjunto sin exportar primero.
Emil Brundage
+1. ¿Existen limitaciones conocidas en la longitud de la cadena para el sqlparámetro?
Paul
@Paul Acabo de probar este código para seleccionar el 100% de las características con una capa que tiene casi 4 millones de características, lo que resultó en un error de memoria. Entonces, aunque no parece haber un límite de cadena rígida, existe una dependencia en la memoria. También hay un límite de elementos SQL para las bases de datos Oracle SDE, sobre el cual he publicado un blog aquí: emilsarcpython.blogspot.com/2015/10/…
Emil Brundage
1
Esri utilizó este código en un blog support.esri.com/en/technical-article/000013141
Emil Brundage
13

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

Sin embargo, otro método que podría intentar sería agregar un atributo llamado Aleatorio para almacenar un número aleatorio: ingrese la descripción de la imagen aquí

Luego, usando la calculadora de campo en ese atributo, con Python Parser, use el siguiente bloque de código:

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

Ver imagen a continuación:

Esto creará valores aleatorios entre 0 y 1. Luego, si desea seleccionar el 20% de las características, puede seleccionar características donde el valor aleatorio sea menor que 0.2. Por supuesto, esto funcionará mejor con muchas características. Creé una clase de entidad con solo 7 entidades como prueba y no había valores inferiores a 0.2. Sin embargo, parece que tiene muchas funciones, por lo que eso no debería importar.

ingrese la descripción de la imagen aquí

Fezter
fuente
77
Este método devolverá en promedio el 20% de las características, que en algunos casos serían preferidas. Pero si desea un 20% cada vez, puede hacer lo sugerido, luego ordenar las características por el valor aleatorio y seleccionar el primer 20%.
Llaves
Esri utilizó este proceso en un blog: support.esri.com/en/technical-article/000013141
Emil Brundage
6

También hay una selección de características anteriores en un script aleatorio de @StephenLead disponible para ArcGIS Desktop. Aunque está escrito, creo, para ArcGIS 9.x, y modificado por última vez en 2008, lo usé aproximadamente en 2010 a las 10.0 y todavía funcionaba bien.

PolyGeo
fuente
5

Puede probar las herramientas de Hawth: http://www.spatialecology.com/htools/rndsel.php

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

blah238
fuente
Desafortunadamente, esa versión no es compatible con ArcGIS 9.3 y superior. Ahora se llama Entorno de modelado geoespacial: spatialecology.com/gme
kenbuja
Buen punto, aquí está el comando equivalente en GME: spatialecology.com/gme/rsample.htm
blah238
El conjunto de herramientas GME no funciona "dentro" de ArcGIS, sino que es una herramienta independiente
Ryan Garnett
3

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

kenbuja
fuente
0

También podría usar la herramienta Subconjuntos de características . De acuerdo con la documentación:

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

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

Ernesto561
fuente