Як довільно підмножити X% вибраних точок?


16

Які методи доступні в ArcGIS 10.2 для випадкового підмноження вибору очок. Наприклад, на доданому скріншоті мені цікаво зберегти 20% вибраних пунктів і видалити решту.

введіть тут опис зображення


Ну, я не думаю, що існує метод за замовчуванням для вибору випадкових точок із шару. Ви спробували із сценарієм python? Або надбудова?
Marcin D

Відповіді:


27

Ось функція 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)

Скопіюйте / вставте це в оболонку python в 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 Я оновив відповідь на вибір підмножини, не експортуючи спочатку.
Брюндаж Еміля

+1. Чи існують відомі обмеження щодо довжини рядка для sqlпараметра?
Пол

@Paul Я просто перевірив цей код, щоб вибрати 100% функцій із шаром, який містить майже 4 мільйони функцій, що призвело до помилки пам'яті. Тому, хоча не існує обмеження жорсткої струни, існує залежність від пам'яті. Існує також обмеження на предмет SQL для баз даних Oracle SDE, про які я тут розміщував свої записи
Emil Brundage

1
Esri використовувала цей код у своєму блозі support.esri.com/en/technical-article/000013141
Брюндаж Еміля

13

Як правило, я також рекомендую використовувати засоби просторової екології, про які йде мова в blah238.

Однак іншим методом, який ви можете спробувати, було б додати атрибут під назвою Random для зберігання випадкового числа: введіть тут опис зображення

Потім, використовуючи калькулятор поля на цьому атрибуті, за допомогою аналізатора Python, використовуйте наступний блок-код:

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
Еміль Брундаж

6

Існує також більш рання функція Select у випадковому сценарії від @StephenLead, доступна для ArcGIS Desktop. Хоча я писав, я думаю, для ArcGIS 9.x, і востаннє змінений у 2008 році, я використав його приблизно у 2010 році в 10.0, і він все ще працював добре.


5

Ви можете спробувати Інструменти Хоута: http://www.spatialecology.com/htools/rndsel.php

Зауважте, що існуючий вибір не вшановується, тому вам доведеться спочатку створити функціональний шар із існуючого вибору.


На жаль, ця версія не сумісна з ArcGIS 9.3 і вище. Тепер це називається середовище геопросторового моделювання: spatialecology.com/gme
kenbuja

Хороший момент, ось еквівалентна команда в GME: spatialecology.com/gme/rsample.htm
blah238

Набір інструментів GME не працює "в межах" ArcGIS, скоріше це окремий інструмент
Райан Гарнетт

3

Ось ще одне доповнення для випадкового вибору для ArcGIS 10, інструмента проектування вибірки . Це дозволить вибрати 20% функцій у вашому наборі даних. Однак для вибраного набору не використовується вибраний набір, подібний до обмежень інструментів Хоута, згаданих blah238.


0

Ви також можете скористатися інструментом " Підмножина" . Відповідно до документації:

Розділяє вихідний набір даних на дві частини: одна частина, яка буде використана для моделювання просторової структури та отримання поверхні, інша, яка буде використана для порівняння та перевірки вихідної поверхні.

Один недолік - те, що вам потрібно розширення Geostatistic Analyst.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.