วิธีการสุ่มเซต X% ของคะแนนที่เลือก


16

มีวิธีการใดบ้างใน ArcGIS 10.2 เพื่อเลือกคะแนนย่อยแบบสุ่ม ตัวอย่างเช่นในภาพหน้าจอที่แนบมาฉันสนใจที่จะเก็บคะแนนที่เลือกไว้ 20% และลบที่เหลือ

ป้อนคำอธิบายรูปภาพที่นี่


ฉันไม่คิดว่าจะมีวิธีการเริ่มต้นสำหรับการเลือกจุดสุ่มจากเลเยอร์ คุณลองใช้สคริปต์ python หรือไม่ หรือเพิ่มเข้า?
Marcin D

คำตอบ:


27

นี่คือฟังก์ชั่นของหลามที่จะเลือกคุณสมบัติแบบสุ่มในเลเยอร์ตามเปอร์เซ็นต์โดยไม่สนใจการเลือกปัจจุบัน:

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)

คัดลอก / วางสิ่งนี้ลงใน python shell ใน ArcMap

จากนั้นในประเภทเชลล์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 ฉันอัพเดตคำตอบสำหรับการเลือกชุดย่อยโดยไม่ส่งออกก่อน
Emil Brundage

+1 มีข้อ จำกัด ใด ๆ ที่ทราบเกี่ยวกับความยาวสตริงสำหรับsqlพารามิเตอร์หรือไม่
พอล

@ พอลฉันเพิ่งทดสอบรหัสนี้เพื่อเลือก 100% ของคุณสมบัติที่มีเลเยอร์ที่มีเกือบ 4 ล้านคุณสมบัติซึ่งส่งผลให้เกิดข้อผิดพลาดของหน่วยความจำ ดังนั้นในขณะที่ดูเหมือนจะไม่มีขีด จำกัด ของสตริง แต่มีการพึ่งพาหน่วยความจำ นอกจากนี้ยังมีข้อ จำกัด ของรายการ SQL สำหรับฐานข้อมูล Oracle SDE ซึ่งฉันบล็อกไว้ที่นี่: emilsarcpython.blogspot.com/2015/10/30
Emil Brundage

1
Esri ใช้รหัสนี้ในบล็อกsupport.esri.com/th/technical-article/000013141
Emil Brundage

13

โดยทั่วไปฉันแนะนำให้ใช้เครื่องมือนิเวศวิทยาเชิงพื้นที่ตามที่กล่าวไว้โดย blah238

อย่างไรก็ตามวิธีอื่นที่คุณสามารถลองได้คือการเพิ่มแอททริบิวชื่อ Random เพื่อเก็บหมายเลขสุ่ม: ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นใช้ตัวคำนวณฟิลด์บนแอตทริบิวต์นั้นด้วย Python Parser ใช้ codeblock ต่อไปนี้:

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
Emil Brundage

6

นอกจากนี้ยังมีคุณสมบัติเลือกก่อนหน้านี้ที่สคริปต์แบบสุ่มจาก @StephenLead สำหรับ ArcGIS Desktop แม้ว่าจะเขียนแล้วฉันคิดว่าสำหรับ ArcGIS 9.x และแก้ไขล่าสุดในปี 2008 ฉันใช้มันในปี 2010 เวลา 10.0 และมันยังทำงานได้ดี


5

คุณสามารถลองใช้เครื่องมือของ Hawth: http://www.spatialecology.com/htools/rndsel.php

โปรดทราบว่าการเลือกที่มีอยู่ไม่ได้รับเกียรติดังนั้นคุณจะต้องสร้างเลเยอร์คุณลักษณะจากการเลือกที่มีอยู่ก่อน


น่าเสียดายที่เวอร์ชันนั้นใช้ไม่ได้กับ ArcGIS 9.3 และสูงกว่า ตอนนี้มันเรียกว่าสภาพแวดล้อมแบบจำลอง Geospatial: spatialecology.com/gme
kenbuja

จุดดีนี่คือคำสั่งที่เทียบเท่าใน GME: spatialecology.com/gme/rsample.htm
blah238

ชุดเครื่องมือ GME ไม่ทำงาน "ภายใน" ArcGIS แต่เป็นเครื่องมือแบบสแตนด์อโลน
Ryan Garnett

3

นี่เป็นอีกหนึ่งการสุ่มเลือก add-in สำหรับ ArcGIS 10 เครื่องมือออกแบบการสุ่มตัวอย่าง มันจะให้คุณเลือก 20% ของฟีเจอร์ในชุดข้อมูลของคุณ อย่างไรก็ตามสิ่งนี้ไม่ได้ใช้ชุดที่เลือกเพื่อทำการเลือกแบบสุ่มซึ่งคล้ายกับข้อ จำกัด ของเครื่องมือของ Hawth ที่กล่าวถึงโดย blah238


0

คุณสามารถใช้เครื่องมือคุณสมบัติการจัดกลุ่ม ตามเอกสาร:

แบ่งชุดข้อมูลดั้งเดิมออกเป็นสองส่วน: ส่วนหนึ่งที่จะใช้ในการสร้างแบบจำลองโครงสร้างเชิงพื้นที่และผลิตพื้นผิวส่วนอื่น ๆ ที่จะใช้ในการเปรียบเทียบและตรวจสอบพื้นผิวเอาท์พุท

ข้อเสียอย่างหนึ่งคือคุณต้องมีส่วนขยายนักวิเคราะห์ทางภูมิศาสตร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.