Ndarray de indexación de número variable de dimensiones

Tengo una instancia de numpy ndarray, pero de un tamaño variable.

import numpy as np dimensions = (4, 4, 4) myarray = np.zeros(shape = dimensions) 

En este caso, obtengo una forma “cúbica” de la matriz y si quiero indexar una porción de myarray puedo usar myarray[:][:][0] porque sé que hay 3 dimensiones (uso 3 pares de [] ).

En el caso de 4 dimensiones, usaría myarray[:][:][:][0] . Pero como el número de dimensiones puede cambiar, no puedo codificarlo de esta manera.

¿Cómo puedo indexar una porción de dicha matriz dependiendo del número de dimensiones? Parece un problema simple, aunque no se me ocurre ninguna solución.

Usted indexa myarray con 1 conjunto de corchetes, no con varios:

 myarray[:,:,:,i] myarray[:,2,:,:] myarray[...,3] myarray[...,3,:] 

Uno : para cada dimensión que quieras. ... numpy a múltiples : – siempre que el numpy pueda identificar claramente el número.

Arrastre : se puede omitir, excepto cuando se usa ...

take se puede utilizar de la misma manera; acepta un parámetro de axis :

 np.take(myarray, i, axis=3) 

También puede construir la indexación como una tupla, por ejemplo,

 ind = [slice(None)]*4 ind[2] = 3 myarray[tuple(ind)] # same as myarray[:,:,3,:] # myarray.take(3, axis=2) 

np.apply_along_axis realiza este estilo de indexación.

p.ej

 In [274]: myarray=np.ones((2,3,4,5)) In [275]: myarray[:,:,3,:].shape Out[275]: (2, 3, 5) In [276]: myarray.take(3,axis=2).shape Out[276]: (2, 3, 5) In [277]: ind=[slice(None)]*4; ind[2]=3 In [278]: ind Out[278]: [slice(None, None, None), slice(None, None, None), 3, slice(None, None, None)] In [279]: myarray[tuple(ind)].shape Out[279]: (2, 3, 5) 

Puedes usar:

 import numpy as np dimensions = (4, 4, 4) myarray = np.zeros(shape = dimensions) print myarray[..., 0] 

Obtendrá el primer elemento del último índice.