es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Muestrear puntos al azar de coordenadas que caigan dentro de un cuadrado.

Tengo una matriz de IDs individuales y otra matriz separada con sus correspondientes coordenadas espaciales en un plano de 20×20. Puedo seleccionar fácilmente a los individuos de partes específicas del plano de la siguiente manera:

from numpy.random import randint
from numpy.random import default_rng

rng = default_rng()
inds = rng.choice(50, size=50, replace=False) # etiquetas individuales
locs = np.random.randint(0, 20, size=(50, 2)) # ubicaciones correspondientes

grupos = {
   'izquierda' : inds[np.logical_and(locs[:, 0] < 10, locs[:, 1] < 20)],
   'derecha' : inds[np.logical_and(locs[:, 0] > 10, locs[:, 1] > 0)]
}

que me da un grupo “izquierda” y “derecha”. Sin embargo, me gustaría soltar aleatoriamente un cuadrado de tamaño 4×4 en el plano y muestrear solo a los individuos que caen dentro de ese cuadrado. ¡Cualquier ayuda sería muy apreciada!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para colocar aleatoriamente un cuadrado de tamaño 4×4 en un plano y seleccionar a las personas que caen dentro de ese cuadrado, puedes seguir los siguientes pasos:

    1. Generar una ubicación aleatoria para la esquina superior izquierda del cuadrado dentro del plano de 20×20 utilizando numpy.random.randint.
    2. Crear una máscara booleana para las personas que caen dentro del cuadrado de 4×4 comprobando si sus coordenadas x e y están dentro del rango de la esquina superior izquierda y la esquina inferior derecha del cuadrado.

    3. Utiliza esta máscara booleana para seleccionar solo a las personas que caen dentro del cuadrado.

    Aquí está el código que logra esto:

    from numpy.random import randint
    from numpy.random import default_rng
    
    rng = default_rng()
    inds = rng.choice(50, size=50, replace=False) # etiquetas individuales
    locs = np.random.randint(0, 20, size=(50, 2)) # ubicaciones correspondientes
    
    # Generar ubicación aleatoria para la esquina superior izquierda del cuadrado de 4x4
    square_tl = np.random.randint(0, 17, size=2)
    
    # Crear una máscara booleana para las personas dentro del cuadrado
    mask = np.logical_and(np.logical_and(locs[:, 0] >= square_tl[0], locs[:, 0] < square_tl[0]+4),
                          np.logical_and(locs[:, 1] >= square_tl[1], locs[:, 1] < square_tl[1]+4))
    
    # Seleccionar las personas dentro del cuadrado
    group = inds[mask]
    

    Este código genera una ubicación aleatoria para la esquina superior izquierda del cuadrado de 4×4 dentro del rango de (0, 0) a (16, 16) para asegurarse de que el cuadrado no salga fuera del plano de 20×20. Luego, crea una máscara booleana para las personas que caen dentro del cuadrado utilizando numpy.logical_and para comprobar si sus coordenadas x e y están dentro del rango del cuadrado. Finalmente, selecciona solo a las personas que caen dentro del cuadrado utilizando esta máscara booleana.

Comments are closed.