¿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.
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:
defSelectRandomByPercent(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"returnif percent <0:print"percent is less than zero"returnimport random
fc = arcpy.Describe(layer).catalogPath
featureCount = float (arcpy.GetCount_management(fc).getOutput (0))
count = int (featureCount * float (percent)/ float (100))ifnot 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.
Una variación para encontrar una selección de subconjunto como se le preguntó:
defSelectRandomByPercent(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"returnif percent <0:print"percent is less than zero"returnimport random
featureCount = float (arcpy.GetCount_management(layer).getOutput (0))
count = int (featureCount * float (percent)/ float (100))ifnot 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:
defSelectRandomByCount(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)
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/…
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:
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.
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%.
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.
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.
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.
Respuestas:
Aquí hay una función de Python que seleccionará entidades aleatorias en una capa en función del porcentaje, ignorando la selección actual:
Copie / pegue esto en el shell de Python en ArcMap.
Luego, en el tipo de shell
SelectRandomByPercent ("layer", num)
, dondelayer
está el nombre de su capa, ynum
es un número entero de su porcentaje.Una variación para encontrar una selección de subconjunto como se le preguntó:
Finalmente, una variación más para seleccionar una capa por un conteo, en lugar de un porcentaje:
fuente
random.sample()
.sql
parámetro?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:
Luego, usando la calculadora de campo en ese atributo, con Python Parser, use el siguiente bloque de código:
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.
fuente
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.
fuente
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.
fuente
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.
fuente
También podría usar la herramienta Subconjuntos de características . De acuerdo con la documentación:
Una desventaja es que necesita la extensión Geostatistical Analyst.
fuente