Come sottoinsegnare casualmente l'X% dei punti selezionati?


15

Quali metodi sono disponibili in ArcGIS 10.2 per sottoporre casualmente una selezione di punti. Ad esempio, nello screenshot allegato sono interessato a mantenere il 20% dei punti selezionati e a eliminare il resto.

inserisci qui la descrizione dell'immagine


Beh, non penso che ci sia un metodo predefinito per selezionare punti casuali dal livello. Hai provato con lo script Python? O componente aggiuntivo?
Marcin D,

Risposte:


26

Ecco una funzione Python che selezionerà le funzioni casuali in un livello in base alla percentuale, ignorando la selezione corrente:

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)

Copia / incolla questo nella shell python in ArcMap.

Quindi nel tipo di shell SelectRandomByPercent ("layer", num), dove si layertrova il nome del layer, ed numè un numero intero della percentuale.

Selezione casuale

Una variante per trovare una selezione di sottoinsieme come richiesto:

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)

Infine, un'altra variazione per selezionare un livello in base a un conteggio, anziché a una percentuale:

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)

Buon uso di random.sample().
Aaron

Grazie @Aaron. Ho aggiornato la risposta per una selezione di sottoinsieme senza esportare prima.
Emil Brundage,

+1. Esistono limiti noti sulla lunghezza della stringa per il sqlparametro?
Paul,

@Paul Ho appena testato questo codice per selezionare il 100% delle funzionalità con un livello che ha quasi 4 milioni di funzionalità, con conseguente errore di memoria. Quindi, mentre non sembra esserci un limite di stringhe rigide, c'è una dipendenza dalla memoria. Esiste anche un limite di elementi SQL per i database Oracle SDE, di cui ho scritto un
Emil Brundage,

1
Esri ha utilizzato questo codice in un blog support.esri.com/en/technical-article/000013141
Emil Brundage,

13

In generale, consiglio anche di usare gli strumenti di ecologia spaziale discussi da blah238.

Tuttavia, un altro metodo che potresti provare sarebbe quello di aggiungere un attributo chiamato Casuale per memorizzare un numero casuale: inserisci qui la descrizione dell'immagine

Quindi, usando il calcolatore di campo su quell'attributo, con Python Parser, usa il seguente blocco di codice:

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

Vedi l'immagine qui sotto:

Ciò creerà valori casuali tra 0 e 1. Quindi, se si desidera selezionare il 20% delle funzioni, è possibile selezionare funzioni in cui il valore Casuale è inferiore a 0,2. Naturalmente, questo funzionerà meglio con molte funzionalità. Ho creato una classe di funzionalità con solo 7 funzionalità come test e non c'erano valori inferiori a 0,2. Tuttavia, sembra che tu abbia molte funzionalità, quindi non dovrebbe importare.

inserisci qui la descrizione dell'immagine


7
questo metodo restituirà in media il 20% delle funzionalità, che in alcuni casi sarebbe preferito. Ma se vuoi il 20% ogni volta, puoi fare come suggerito, quindi ordinare le caratteristiche in base al valore casuale e selezionare il primo 20%.
Llaves,

Esri ha utilizzato questo processo in un blog: support.esri.com/en/technical-article/000013141
Emil Brundage,

6

Esiste anche una funzionalità Select precedente a script casuale da @StephenLead disponibile per ArcGIS Desktop. Anche se scritto, credo, per ArcGIS 9.xe modificato l'ultima volta nel 2008, l'ho usato a circa 2010 alla 10.0 e funzionava ancora bene.


5

Potresti provare Hawth's Tools: http://www.spatialecology.com/htools/rndsel.php

Si noti che la selezione esistente non viene onorata, quindi è necessario creare prima un layer funzionalità dalla selezione esistente.


Sfortunatamente, quella versione non è compatibile con ArcGIS 9.3 e versioni successive. Ora si chiama Geospatial Modeling Environment: spatialecology.com/gme
kenbuja

Buon punto, ecco il comando equivalente in GME: spatialecology.com/gme/rsample.htm
blah238

Il set di strumenti GME non funziona "all'interno" di ArcGIS, piuttosto è uno strumento autonomo
Ryan Garnett,

3

Ecco un altro componente aggiuntivo di selezione casuale per ArcGIS 10, Sampling Design Tool . Ti permetterà di selezionare il 20% delle funzionalità nel tuo set di dati. Tuttavia, questo non utilizza un set selezionato per effettuare una selezione casuale, simile alle restrizioni degli strumenti di Hawth menzionate da blah238.


0

È inoltre possibile utilizzare le funzioni del sottoinsieme strumento . Secondo la documentazione:

Divide il set di dati originale in due parti: una parte da utilizzare per modellare la struttura spaziale e produrre una superficie, l'altra da utilizzare per confrontare e validare la superficie di output.

Uno svantaggio è che hai bisogno dell'estensione Geostatistical Analyst.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.