Hay dos métodos que puede utilizar aquí. La primera (y probablemente el más fácil), es la generación de un número de la muestra objeto de Id de su candidato puntos de la capa, agarrar el asociado geometrías, ordenar y, a continuación, aplicar los resultados a los puntos de entrada. Por ejemplo (voy a asumir que sus puntos de entrada son input_points
y sus candidatos son candidates
):
import arcpy
import numpy as np
num_inputs = int(arcpy.GetCount_management(input_points).getOutput(0))
num_candidates = int(arcpy.GetCount_management(candidates).getOutput(0))
# replace with np.random.randint(num_candidates, size=num_inputs) if you want repetition
ids = np.random.choice(num_candidates, size=num_inputs, replace=False)
# Limit the points queried from the dataset with the where clause
where_clause = "{oid_field_name} in ({ids})".format(
oid_field_name=arcpy.Describe(candidates).OIDFieldName,
ids=", ".join(str(i) for i in ids)
)
candidate_shape_field = arcpy.Describe(candidates).shapeFieldName
# Get the actual geometries
geoms = np.random.permutation([
row.getValue(candidate_shape_field)
for row in arcpy.SearchCursor(candidates, where_clause)
])
# Finally, update the original dataset (BACKUP BEFORE TRYING THIS AT HOME!)
input_shape_field = arcpy.Describe(input_points).shapeFieldName
cursor = arcpy.UpdateCursor(input_points)
for geom, row in zip(geoms, cursor):
row.setValue(input_shape_field, geom)
cursor.updateRow(row)
El segundo (que creo que es un poco más interesante) es el uso de embalse de muestreo para seleccionar los n puntos al azar. En lugar de volver a la implementación de este usted mismo podría utilizar el [algoritmo de Austin Rochford del post] para generar muestras así:
import itertools as itl
def sample_after(stream, k):
"""
Return a random sample ok k elements drawn without replacement from stream.
This function is designed to be used when the elements of stream cannot
fit into memory.
"""
r = np.array(list(itl.islice(stream, k)))
for t, x in enumerate(stream, k + 1):
i = np.random.randint(1, t + 1)
if i <= k:
r[i - 1] = x
return r
geoms = sample_after(
(
row.getValue(candidate_shape_field)
for row in arcpy.SearchCursor(candidates)
),
num_inputs
)
for geom, row in zip(geoms, cursor):
row.setValue(input_shape_field, geom)
cursor.updateRow(row)