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.
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.
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:
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 layer
está el nombre de su capa, y num
es un número entero de su porcentaje.
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)
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:
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.
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.
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.
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.
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.