Как случайным образом установить X% выбранных точек?

15

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

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

Аарон
источник
Ну, я не думаю, что есть метод по умолчанию для выбора случайных точек из слоя. Вы пробовали с помощью скрипта Python? Или надстройка?
Марцин Д

Ответы:

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)

Скопируйте / вставьте это в оболочку 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().
Аарон
Спасибо, Аарон. Я обновил ответ для выбора подмножества без предварительного экспорта.
Эмиль Брундейдж
+1. Есть ли известные ограничения на длину строки для sqlпараметра?
Пол
@Paul Я только что протестировал этот код, чтобы выбрать 100% объектов со слоем, который имеет почти 4 миллиона объектов, что привело к ошибке памяти. Таким образом, несмотря на то, что не существует жесткого ограничения строки, существует зависимость от памяти. Существует также ограничение на количество элементов SQL для баз данных Oracle SDE, о которых я писал в блоге: emilsarcpython.blogspot.com/2015/10/…
Эмиль
1
Esri использовала этот код в блоге support.esri.com/en/technical-article/000013141
Эмиль Брундейдж,
13

В общем, я также рекомендую использовать инструменты пространственной экологии, как описано в blah238.

Тем не менее, другой метод, который вы можете попробовать, это добавить атрибут Random для хранения случайного числа: введите описание изображения здесь

Затем, используя калькулятор поля для этого атрибута, с анализатором Python, используйте следующий кодовый блок:

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

Смотрите изображение ниже:

Это создаст случайные значения в диапазоне от 0 до 1. Затем, если вы хотите выбрать 20% объектов, вы можете выбрать объекты, в которых значение Random меньше 0,2. Конечно, это будет работать лучше со многими функциями. В качестве теста я создал класс пространственных объектов, в котором было всего 7 объектов, и значения не превышали 0,2. Тем не менее, похоже, у вас есть много функций, так что это не должно иметь значения.

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

Фезтер
источник
7
этот метод вернет в среднем 20% функций, которые в некоторых случаях предпочтительнее. Но если вы хотите получить 20% каждый раз, вы можете сделать то, что предложено, затем отсортировать объекты по случайному значению и выбрать первые 20%.
Llaves
Эсри использовала этот процесс в блоге: support.esri.com/en/technical-article/000013141
Эмиль Брундейдж,
6

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

PolyGeo
источник
5

Вы можете попробовать инструменты Hawth's: http://www.spatialecology.com/htools/rndsel.php

Обратите внимание, что существующий выбор не учитывается, поэтому вам сначала нужно создать векторный слой из существующего выбора.

blah238
источник
К сожалению, эта версия не совместима с ArcGIS 9.3 и выше. Теперь это называется геопространственной среда моделирования: spatialecology.com/gme
kenbuja
Хороший момент, здесь является эквивалентом команды в GME: spatialecology.com/gme/rsample.htm
blah238
Набор инструментов GME не работает «внутри» ArcGIS, скорее это самостоятельный инструмент
Райан Гарнетт
3

Вот еще одна надстройка случайного выбора для ArcGIS 10, Инструмент проектирования выборки . Это позволит вам выбрать 20% функций в вашем наборе данных. Однако, это не использует выбранный набор, чтобы сделать случайный выбор, аналогично ограничениям Инструментов Хота, упомянутым в blah238.

kenbuja
источник
0

Вы также можете использовать инструмент Subset Features . Согласно документации:

Делит исходный набор данных на две части: одна часть используется для моделирования пространственной структуры и создания поверхности, а другая - для сравнения и проверки выходной поверхности.

Недостатком является то, что вам нужно расширение Geostatistical Analyst.

Ernesto561
источник