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.

Indexación de Numpy de una malla grande.

Me gustaría tener una forma de indexar una rejilla de malla de Numpy de d dimensiones:

  • sin almacenar la rejilla de malla densa completa en memoria
  • que admita todos los tipos de indexación admitidos por la rejilla de malla densa completa

Como ejemplo:

x = np.random.randn(Nx)
y = np.random.randn(Ny)
z = np.random.randn(Nz)

xg, yg, zg = np.meshgrid(x, y, z, indexing='ij')
X = np.concatenate([xg[..., None], yg[..., None], zg[..., None]], axis=-1)

Una vez que tengo X, puedo usar todos los métodos de indexación de numpy, por ejemplo:

X[10:20,1:9:3,:]

X[(
    [0, 1, 3, 5],
    [1, 1, 3, 3],
    [2, 7, 8, 9]
    )]

Tengo casos en los que el producto Nx * Ny * Nz es demasiado grande para caber en memoria (por ejemplo, Nx = Ny = Nz = 4000), pero me gustaría poder extraer partes de mi cubo utilizando la indexación.

¿Existe alguna forma de lograr esto sin tener que volver a codificar la lógica de indexación de numpy? La respuesta en 3D se vería así:

def meshgrid_index(x, y, z, index):
    # index es el argumento que normalmente se pasa a X.__getitem__
    # debería admitir todos los tipos de indexación
    ...

¡Gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, existen formas de lograr indexar una malla numpy d-dimensional sin almacenar la malla densa completa en memoria. Una forma es utilizar la indexación avanzada de numpy, que permite seleccionar elementos de un arreglo basándose en un índice o una máscara booleana.

    Aquí tienes un ejemplo de cómo crear una malla utilizando indexación avanzada:

    Nx = Ny = Nz = 4000
    x = np.arange(Nx)
    y = np.arange(Ny)
    z = np.arange(Nz)
    
    X, Y, Z = np.ix_(x, y, z)
    

    La función ix_() crea una malla abierta a partir de múltiples secuencias. Funciona creando un arreglo de índices N-dimensional para cada secuencia, y luego concatenándolos a lo largo de la última dimensión.

    Ahora, podemos utilizar la indexación avanzada para seleccionar porciones de la malla:

    X[10:20, 1:9:3, :]
    X[[0, 1, 3, 5], [1, 1, 3, 3], [2, 7, 8, 9]]
    

    Esto devolverá los mismos resultados que antes, pero sin tener que crear la malla densa completa.

    Para encapsular esto en una función meshgrid_index, podemos utilizar el siguiente código:

    def meshgrid_index(x, y, z, index):
        ixgrid = np.ix_(x, y, z)
        return ixgrid[index]
    

    La función ix_() se utiliza para crear la malla utilizando la indexación avanzada, y se pasa el argumento index para devolver las porciones seleccionadas de la malla. Esta función debería soportar todos los tipos de indexación que numpy admite.

Comments are closed.