선택한 점의 X %를 무작위로 부분 집합하는 방법은 무엇입니까?


15

선택한 포인트를 임의로 서브셋하기 위해 ArcGIS 10.2에서 사용할 수있는 방법 예를 들어 첨부 된 스크린 샷에서 선택한 점의 20 %를 유지하고 나머지를 삭제하는 데 관심이 있습니다.

여기에 이미지 설명을 입력하십시오


레이어에서 임의의 점을 선택하는 기본 방법이 없다고 생각합니다. 파이썬 스크립트를 사용해 보셨습니까? 아니면 애드 인?
Marcin D

답변:


26

다음은 현재 선택을 무시하고 백분율을 기준으로 레이어에서 임의의 기능을 선택하는 python 함수입니다.

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)

이것을 ArcMap의 python shell에 복사 / 붙여 넣기하십시오.

그런 다음 셸 유형 SelectRandomByPercent ("layer", num)에서 layer레이어의 이름은 num백분율이며 정수는 정수입니다.

무작위 선택

요청에 따라 서브 세트 선택을 찾는 변형 :

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)

마지막으로 백분율 대신 카운트로 레이어를 선택할 수있는 변형이 하나 더 있습니다.

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().
Aaron

감사합니다 @Aaron. 먼저 내 보내지 않고 서브 세트 선택에 대한 답변을 업데이트했습니다.
Emil Brundage

+1. sql매개 변수의 문자열 길이에 대한 알려진 제한 사항이 있습니까?
Paul

@Paul 방금이 코드를 테스트하여 거의 4 백만 개의 기능을 가진 계층으로 기능의 100 %를 선택하여 메모리 오류가 발생했습니다. 따라서 하드 문자열 제한이없는 것처럼 보이지만 메모리에 대한 종속성이 있습니다. 내가 여기에 대해 블로그에 한 오라클 SDE의 데이터베이스에 대한 SQL 항목 제한이있다 : emilsarcpython.blogspot.com/2015/10/...은
에밀 Brundage

1
ESRI는 블로그에이 코드를 사용 support.esri.com/en/technical-article/000013141
에밀 Brundage에게

13

일반적으로, blah238에서 논의한 공간 생태 도구를 사용하는 것이 좋습니다.

그러나 시도 할 수있는 또 다른 방법은 Random이라는 속성을 추가하여 난수를 저장하는 것입니다. 여기에 이미지 설명을 입력하십시오

그런 다음 해당 속성의 필드 계산기를 Python Parser와 함께 사용하여 다음 코드 블록을 사용하십시오.

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

아래 이미지를보십시오 :

이렇게하면 0과 1 사이의 임의의 값이 생성됩니다. 그런 다음 피쳐의 20 %를 선택하려면 랜덤 값이 0.2보다 작은 피쳐를 선택할 수 있습니다. 물론 이것은 많은 기능에서 더 잘 작동합니다. 테스트로 7 개의 기능 만있는 기능 클래스를 작성했으며 0.2보다 작은 값은 없었습니다. 그러나 많은 기능이있는 것처럼 보이므로 중요하지 않습니다.

여기에 이미지 설명을 입력하십시오


7
이 방법은 기능의 평균 20 %를 반환 하며 경우에 따라 선호됩니다. 그러나 매번 20 %를 원한다면 제안대로 할 수 있으며, 임의의 값으로 기능을 정렬하고 처음 20 %를 선택하십시오.
Llaves

: ESRI는 블로그에서이 프로세스를 사용 support.esri.com/en/technical-article/000013141
에밀 Brundage

6

ArcGIS Desktop에 사용할 수있는 @StephenLead의 임의 스크립트에서 이전의 Select 기능이 있습니다. 필자는 ArcGIS 9.x 용으로 작성되었지만 2008 년에 마지막으로 수정되었지만 2010 년에 10.0으로 사용했지만 여전히 잘 작동했습니다.


5

Hawth의 도구를 사용해보십시오 : http://www.spatialecology.com/htools/rndsel.php

기존 선택은 적용되지 않으므로 먼저 기존 선택에서 피처 레이어를 만들어야합니다.


불행히도, 해당 버전은 ArcGIS 9.3 이상과 호환되지 않습니다. 지금은 지리 공간 모델링 환경라고 : spatialecology.com/gme
kenbuja

좋은 점은, 여기 GME에 해당하는 명령입니다 spatialecology.com/gme/rsample.htm
blah238

GME 툴셋은 ArcGIS 내에서 작동하지 않고 독립형 툴입니다
Ryan Garnett

3

ArcGIS 10을위한 또 다른 무작위 선택 추가 기능인 샘플링 디자인 툴이 있습니다. 데이터 세트에서 기능의 20 %를 선택할 수 있습니다. 그러나 이것은 blah238이 언급 한 Hawth 's Tools의 제한과 유사하게 무작위로 선택하기 위해 선택된 세트를 사용하지 않습니다.


0

하위 집합 기능 도구를 사용할 수도 있습니다 . 설명서에 따르면 :

원래 데이터 셋을 두 부분으로 나눕니다. 하나는 공간 구조를 모델링하고 표면을 생성하는 데 사용되고 다른 하나는 출력 표면을 비교하고 검증하는 데 사용됩니다.

한 가지 단점은 Geostatistical Analyst 확장이 필요하다는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.