Làm thế nào để tập hợp ngẫu nhiên X% số điểm được chọn?


15

Những phương thức nào có sẵn trong ArcGIS 10.2 để tập hợp ngẫu nhiên một lựa chọn các điểm. Ví dụ, trong ảnh chụp màn hình đính kèm, tôi quan tâm đến việc giữ 20% số điểm đã chọn và xóa phần còn lại.

nhập mô tả hình ảnh ở đây


Tôi không nghĩ có một phương pháp mặc định để chọn các điểm ngẫu nhiên từ lớp. Bạn đã thử với kịch bản python? Hoặc bổ trợ?
Marcin D

Câu trả lời:


26

Đây là một hàm python sẽ chọn các tính năng ngẫu nhiên trong một lớp dựa trên phần trăm, bỏ qua lựa chọn hiện tại:

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)

Sao chép / dán cái này vào shell python trong ArcMap.

Sau đó, trong loại vỏ SelectRandomByPercent ("layer", num), layertên của lớp của bạn và numlà một số phần trăm của bạn.

Lựa chọn ngẫu nhiên

Một biến thể để tìm một lựa chọn tập hợp con như đã hỏi:

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)

Cuối cùng, thêm một biến thể để chọn một lớp theo số đếm, thay vì phần trăm:

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)

Sử dụng tốt đẹp của random.sample().
Aaron

Cảm ơn @Aaron. Tôi đã cập nhật câu trả lời cho một lựa chọn tập hợp con mà không xuất trước.
Emil Brundage

+1. Có bất kỳ giới hạn đã biết nào về độ dài chuỗi cho sqltham số không?
Paul

@Paul Tôi vừa kiểm tra mã này để chọn 100% tính năng với một lớp có gần 4 triệu tính năng, dẫn đến lỗi bộ nhớ. Vì vậy, trong khi dường như không có giới hạn chuỗi cứng, có sự phụ thuộc vào bộ nhớ. Ngoài ra còn có giới hạn mục SQL cho cơ sở dữ liệu Oracle SDE mà tôi đã viết ở đây: emilsarcpython.blogspot.com/2015/10/ Kẻ
Emil Brundage

1
Esri đã sử dụng mã này trong một blog hỗ
Emil Brundage

13

Nói chung, tôi cũng khuyên bạn nên sử dụng các công cụ sinh thái không gian như được thảo luận bởi blah238.

Tuy nhiên, một phương pháp khác bạn có thể thử là thêm một thuộc tính có tên Random để lưu một số ngẫu nhiên: nhập mô tả hình ảnh ở đây

Sau đó, bằng cách sử dụng máy tính trường trên thuộc tính đó, với Trình phân tích cú pháp Python, sử dụng bộ mã sau:

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

Xem hình ảnh dưới đây:

Điều này sẽ tạo các giá trị ngẫu nhiên trong khoảng từ 0 đến 1. Sau đó, nếu bạn muốn chọn 20% các tính năng, bạn có thể chọn các tính năng trong đó giá trị Ngẫu nhiên nhỏ hơn 0,2. Tất nhiên, điều này sẽ hoạt động tốt hơn với nhiều tính năng. Tôi đã tạo một lớp đối tượng chỉ có 7 tính năng dưới dạng thử nghiệm và không có giá trị nào dưới 0,2. Tuy nhiên, có vẻ như bạn có nhiều tính năng, vì vậy điều đó không quan trọng.

nhập mô tả hình ảnh ở đây


7
phương pháp này sẽ trả về trung bình 20% các tính năng, trong một số trường hợp sẽ được ưu tiên. Nhưng nếu bạn muốn 20% mỗi lần, bạn có thể làm như được đề xuất, sau đó sắp xếp các tính năng theo giá trị ngẫu nhiên và chọn 20% đầu tiên.
Llaves

Esri đã sử dụng quy trình này trong một blog: support.esri.com/en/technical-article/000013141
Emil Brundage

6

Ngoài ra còn có một tính năng Chọn trước đó tập lệnh ngẫu nhiên từ @StephenLead có sẵn cho ArcGIS Desktop. Mặc dù được viết, tôi nghĩ, đối với ArcGIS 9.x và lần sửa đổi cuối cùng vào năm 2008, tôi đã sử dụng nó vào khoảng năm 2010 ở mức 10.0 và nó vẫn hoạt động tốt.


5

Bạn có thể dùng thử Công cụ của Hawth: http://www.spatialecology.com/htools/rndsel.php

Lưu ý rằng lựa chọn hiện tại không được vinh danh nên trước tiên bạn phải tạo một lớp đối tượng từ lựa chọn hiện có.


Thật không may, phiên bản đó không tương thích với ArcGIS 9.3 trở lên. Bây giờ, nó được gọi là Môi trường mô hình không gian địa lý: spatialecology.com/gme
kenbuja

Điểm hay, đây là lệnh tương đương trong GME: spatialecology.com/gme/rsample.htmlm
blah238

Bộ công cụ GME không hoạt động "bên trong" ArcGIS, thay vào đó nó là một công cụ độc lập
Ryan Garnett

3

Đây là một bổ trợ lựa chọn ngẫu nhiên khác cho ArcGIS 10, Công cụ thiết kế lấy mẫu . Nó sẽ cho phép bạn chọn 20% các tính năng trong bộ dữ liệu của bạn. Tuy nhiên, điều này không sử dụng một bộ được chọn để tạo một lựa chọn ngẫu nhiên, tương tự như các hạn chế của Công cụ Hawth được đề cập bởi blah238.


0

Bạn cũng có thể sử dụng công cụ Tính năng tập hợp con . Theo tài liệu:

Chia tập dữ liệu gốc thành hai phần: một phần được sử dụng để mô hình hóa cấu trúc không gian và tạo ra một bề mặt, phần còn lại được sử dụng để so sánh và xác nhận bề mặt đầu ra.

Một nhược điểm là bạn cần phần mở rộng Phân tích địa lý.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.