Как случайным образом установить X% выбранных точек?
15
Какие методы доступны в ArcGIS 10.2 для случайного подмножества выбранных точек. Например, на прикрепленном скриншоте я заинтересован в сохранении 20% выбранных точек и удалении остальных.
Ну, я не думаю, что есть метод по умолчанию для выбора случайных точек из слоя. Вы пробовали с помощью скрипта Python? Или надстройка?
Марцин Д
Ответы:
26
Вот функция Python, которая будет выбирать случайные объекты в слое на основе процентов, игнорируя текущий выбор:
defSelectRandomByPercent(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"returnif percent <0:print"percent is less than zero"returnimport random
fc = arcpy.Describe(layer).catalogPath
featureCount = float (arcpy.GetCount_management(fc).getOutput (0))
count = int (featureCount * float (percent)/ float (100))ifnot 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целое число ваших процентов.
Вариант для поиска подмножества в соответствии с запросом:
defSelectRandomByPercent(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"returnif percent <0:print"percent is less than zero"returnimport random
featureCount = float (arcpy.GetCount_management(layer).getOutput (0))
count = int (featureCount * float (percent)/ float (100))ifnot 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)
Наконец, еще один вариант выбора слоя по количеству вместо процента:
defSelectRandomByCount(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)
Спасибо, Аарон. Я обновил ответ для выбора подмножества без предварительного экспорта.
Эмиль Брундейдж
+1. Есть ли известные ограничения на длину строки для sqlпараметра?
Пол
@Paul Я только что протестировал этот код, чтобы выбрать 100% объектов со слоем, который имеет почти 4 миллиона объектов, что привело к ошибке памяти. Таким образом, несмотря на то, что не существует жесткого ограничения строки, существует зависимость от памяти. Существует также ограничение на количество элементов SQL для баз данных Oracle SDE, о которых я писал в блоге: emilsarcpython.blogspot.com/2015/10/…
В общем, я также рекомендую использовать инструменты пространственной экологии, как описано в blah238.
Тем не менее, другой метод, который вы можете попробовать, это добавить атрибут Random для хранения случайного числа:
Затем, используя калькулятор поля для этого атрибута, с анализатором Python, используйте следующий кодовый блок:
import random
def rand():
return random.random()
Смотрите изображение ниже:
Это создаст случайные значения в диапазоне от 0 до 1. Затем, если вы хотите выбрать 20% объектов, вы можете выбрать объекты, в которых значение Random меньше 0,2. Конечно, это будет работать лучше со многими функциями. В качестве теста я создал класс пространственных объектов, в котором было всего 7 объектов, и значения не превышали 0,2. Тем не менее, похоже, у вас есть много функций, так что это не должно иметь значения.
этот метод вернет в среднем 20% функций, которые в некоторых случаях предпочтительнее. Но если вы хотите получить 20% каждый раз, вы можете сделать то, что предложено, затем отсортировать объекты по случайному значению и выбрать первые 20%.
Для ArcGIS Desktop доступны также более ранние функции выбора в произвольном сценарии из @StephenLead. Хотя написано, я думаю, для ArcGIS 9.x и последний раз изменено в 2008 году, я использовал его примерно в 2010 году в 10.0, и он все еще работал хорошо.
Набор инструментов GME не работает «внутри» ArcGIS, скорее это самостоятельный инструмент
Райан Гарнетт
3
Вот еще одна надстройка случайного выбора для ArcGIS 10, Инструмент проектирования выборки . Это позволит вам выбрать 20% функций в вашем наборе данных. Однако, это не использует выбранный набор, чтобы сделать случайный выбор, аналогично ограничениям Инструментов Хота, упомянутым в blah238.
Вы также можете использовать инструмент Subset Features . Согласно документации:
Делит исходный набор данных на две части: одна часть используется для моделирования пространственной структуры и создания поверхности, а другая - для сравнения и проверки выходной поверхности.
Недостатком является то, что вам нужно расширение Geostatistical Analyst.
Ответы:
Вот функция Python, которая будет выбирать случайные объекты в слое на основе процентов, игнорируя текущий выбор:
Скопируйте / вставьте это в оболочку python в ArcMap.
Затем в типе оболочки
SelectRandomByPercent ("layer", num)
, гдеlayer
указано имя вашего слоя иnum
целое число ваших процентов.Вариант для поиска подмножества в соответствии с запросом:
Наконец, еще один вариант выбора слоя по количеству вместо процента:
источник
random.sample()
.sql
параметра?В общем, я также рекомендую использовать инструменты пространственной экологии, как описано в blah238.
Тем не менее, другой метод, который вы можете попробовать, это добавить атрибут Random для хранения случайного числа:
Затем, используя калькулятор поля для этого атрибута, с анализатором Python, используйте следующий кодовый блок:
Смотрите изображение ниже:
Это создаст случайные значения в диапазоне от 0 до 1. Затем, если вы хотите выбрать 20% объектов, вы можете выбрать объекты, в которых значение Random меньше 0,2. Конечно, это будет работать лучше со многими функциями. В качестве теста я создал класс пространственных объектов, в котором было всего 7 объектов, и значения не превышали 0,2. Тем не менее, похоже, у вас есть много функций, так что это не должно иметь значения.
источник
Для ArcGIS Desktop доступны также более ранние функции выбора в произвольном сценарии из @StephenLead. Хотя написано, я думаю, для ArcGIS 9.x и последний раз изменено в 2008 году, я использовал его примерно в 2010 году в 10.0, и он все еще работал хорошо.
источник
Вы можете попробовать инструменты Hawth's: http://www.spatialecology.com/htools/rndsel.php
Обратите внимание, что существующий выбор не учитывается, поэтому вам сначала нужно создать векторный слой из существующего выбора.
источник
Вот еще одна надстройка случайного выбора для ArcGIS 10, Инструмент проектирования выборки . Это позволит вам выбрать 20% функций в вашем наборе данных. Однако, это не использует выбранный набор, чтобы сделать случайный выбор, аналогично ограничениям Инструментов Хота, упомянутым в blah238.
источник
Вы также можете использовать инструмент Subset Features . Согласно документации:
Недостатком является то, что вам нужно расширение Geostatistical Analyst.
источник