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!
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 denumpy
, 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:
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:
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:La función
ix_()
se utiliza para crear la malla utilizando la indexación avanzada, y se pasa el argumentoindex
para devolver las porciones seleccionadas de la malla. Esta función debería soportar todos los tipos de indexación quenumpy
admite.