Corte dynamic de Python Array

Me enfrento a una situación en la que tengo un número MUY numpy.ndarray (en realidad, es un conjunto de datos hdf5) en el que necesito encontrar un subconjunto de forma rápida porque no se puede tener en la memoria todo el conjunto. Sin embargo, tampoco quiero iterar a través de una matriz de este tipo (incluso declarar que el iterador numpy incorporado genera un MemoryError ) porque mi script tardaría literalmente días en ejecutarse.

Como tal, me enfrento a la situación de iterar a través de algunas dimensiones de la matriz para poder realizar operaciones de matriz en subconjuntos reducidos de la matriz completa. Para hacer eso, necesito poder dividir dinámicamente un subconjunto de la matriz. Rebanar dynamic significa construir una tupla y pasarla.

Por ejemplo, en lugar de

 my_array[0,0,0] 

Yo podría usar

 my_array[(0,0,0,)] 

Aquí está el problema: si quiero dividir manualmente todos los valores a lo largo de una dimensión / eje particular de la matriz, podría hacer algo como

     my_array[0,:,0] > array([1, 4, 7]) 

    Sin embargo, esto no funciona si uso una tupla:

     my_array[(0,:,0,)] 

    donde obtendré un SyntaxError .

    ¿Cómo puedo hacer esto cuando tengo que construir dinámicamente la división para poner algo entre los paréntesis de la matriz?

    Podrías rebanar automáticamente usando la slice de python:

     >>> a = np.random.rand(3, 4, 5) >>> a[0, :, 0] array([ 0.48054702, 0.88728858, 0.83225113, 0.12491976]) >>> a[(0, slice(None), 0)] array([ 0.48054702, 0.88728858, 0.83225113, 0.12491976]) 

    El método de slice se lee como slice(*start*, stop[, step]) . Si solo se pasa un argumento, entonces se interpreta como una slice(0, stop) .

    En el ejemplo anterior : se traduce a una slice(0, end) que es equivalente a una slice(None) .

    Otros ejemplos de rebanadas:

     :5 -> slice(5) 1:5 -> slice(1, 5) 1: -> slice(1, None) 1::2 -> slice(1, None, 2) 

    Bien, finalmente encontré una respuesta tal como alguien más lo hizo.

    Supongamos que tengo una matriz:

     my_array[...] >array( [[[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9]], [[10, 11, 12], [13, 14, 15], [16, 17, 18]]]) 

    Puedo usar el objeto slice , que aparentemente es una cosa:

     sl1 = slice( None ) sl2 = slice( 1,2 ) sl3 = slice( None ) ad_array.matrix[(sl1, sl2, sl3)] >array( [[[ 4, 5, 6]], [[13, 14, 15]]])