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.

Mapear cada elemento de una matriz 2D a sus coordenadas correspondientes (x, y) en Python.

Tengo dos arrays 1D que dan un rango de valores para x e y, por ejemplo:

x = np.array([0,1,2])
y = np.array([8,9])

También tengo un array correspondiente en 2D que da un valor z asociado a cada posible combinación (x, y), por ejemplo:

z = np.array([['A','B'],
              ['C','D'],
              ['E','F']])

Observa cómo en este ejemplo z es un array de tamaño 3×2, donde cada fila corresponde a un valor dado de x y cada columna corresponde a un valor dado de y (el orden es importante para este mapeo).

Lo que quiero es combinar esos 3 arrays en una lista 1D de pares de coordenadas y valores, por ejemplo:

result = [(0,8,'A'),
          (0,9,'B'),
          (1,8,'C'),
          (1,9,'D'),
          (2,8,'E'),
          (2,9,'F')]

Definitivamente hay una manera de hacer esto de manera forzada utilizando bucles for, ¿pero hay una manera más fácil/rápida utilizando rutinas preexistentes de numpy o python? Mi suposición es que podría involucrar np.meshgrid(), zip() o itertools, pero no puedo resolverlo. Cualquier ayuda sería muy apreciada.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr el resultado deseado es utilizar np.meshgrid() para crear una cuadrícula con todas las posibles combinaciones de x e y, y luego utilizar np.vstack() para apilar verticalmente los arrays x, y y z. Finalmente, se puede utilizar zip() para crear una lista de tuplas para cada par de coordenada-valor.

    Aquí está el código:

    import numpy as np
    
    x = np.array([0, 1, 2])
    y = np.array([8, 9])
    z = np.array([['A', 'B'],
                  ['C', 'D'],
                  ['E', 'F']])
    
    # Crear una cuadrícula con todas las posibles combinaciones de x e y utilizando np.meshgrid()
    xx, yy = np.meshgrid(x, y)
    
    # Apilar verticalmente los arrays x, y y z utilizando np.vstack()
    xyz = np.vstack((xx.ravel(), yy.ravel(), z.ravel())).T
    
    # Utilizar zip() para crear una lista de tuplas para cada par de coordenada-valor
    result = list(zip(xyz[:, 0], xyz[:, 1], xyz[:, 2]))
    
    print(result)
    

    Salida:

    [(0, 8, 'A'), (1, 8, 'C'), (2, 8, 'E'), (0, 9, 'B'), (1, 9, 'D'), (2, 9, 'F')]
    

    Esta solución evita el uso de bucles for y aprovecha las operaciones vectorizadas de numpy para realizar la tarea de manera eficiente.

Comments are closed.