4 votos

Asignar aleatoriamente nuevas ubicaciones XY

Tengo dos capas de forma, uno con 93 puntos y la otra capa que contiene 15075 puntos. Estoy tratando de asignar en forma aleatoria una nueva XY posición para cada uno de los 93 puntos a cualquiera de los 15075 ubicaciones de puntos en la segunda capa.

He intentado usar el crear puntos aleatorios de la herramienta, pero esto sólo me permite generar puntos aleatorios de la 15075 saber los puntos. Me gustaría mover cada uno de mis 93 puntos de la primera capa a una ubicación aleatoria en la segunda capa, de manera que pueda medir la distancia recorrida.

¿Alguien tiene alguna idea?

1voto

ESV Puntos 4591

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)

0voto

John Kramlich Puntos 286

Suponiendo que su conjunto de datos de 15k puntos es aleatorio, ¿podría hacer una unión espacial utilizando la relación más cercana? Si bien cada combinación es una relación consistente (por ejemplo, la más cercana) si los datos subyacentes se distribuyen al azar, ¿habría pensado que habría logrado lo que desea?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X