답변:
다음은 현재 선택을 무시하고 백분율을 기준으로 레이어에서 임의의 기능을 선택하는 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()
.
sql
매개 변수의 문자열 길이에 대한 알려진 제한 사항이 있습니까?
일반적으로, blah238에서 논의한 공간 생태 도구를 사용하는 것이 좋습니다.
그러나 시도 할 수있는 또 다른 방법은 Random이라는 속성을 추가하여 난수를 저장하는 것입니다.
그런 다음 해당 속성의 필드 계산기를 Python Parser와 함께 사용하여 다음 코드 블록을 사용하십시오.
import random
def rand():
return random.random()
아래 이미지를보십시오 :
이렇게하면 0과 1 사이의 임의의 값이 생성됩니다. 그런 다음 피쳐의 20 %를 선택하려면 랜덤 값이 0.2보다 작은 피쳐를 선택할 수 있습니다. 물론 이것은 많은 기능에서 더 잘 작동합니다. 테스트로 7 개의 기능 만있는 기능 클래스를 작성했으며 0.2보다 작은 값은 없었습니다. 그러나 많은 기능이있는 것처럼 보이므로 중요하지 않습니다.
ArcGIS Desktop에 사용할 수있는 @StephenLead의 임의 스크립트에서 이전의 Select 기능이 있습니다. 필자는 ArcGIS 9.x 용으로 작성되었지만 2008 년에 마지막으로 수정되었지만 2010 년에 10.0으로 사용했지만 여전히 잘 작동했습니다.
Hawth의 도구를 사용해보십시오 : http://www.spatialecology.com/htools/rndsel.php
기존 선택은 적용되지 않으므로 먼저 기존 선택에서 피처 레이어를 만들어야합니다.
ArcGIS 10을위한 또 다른 무작위 선택 추가 기능인 샘플링 디자인 툴이 있습니다. 데이터 세트에서 기능의 20 %를 선택할 수 있습니다. 그러나 이것은 blah238이 언급 한 Hawth 's Tools의 제한과 유사하게 무작위로 선택하기 위해 선택된 세트를 사용하지 않습니다.