Python avanzado rebanado

Estoy un poco confundido con el rebanado avanzado de Python. Básicamente tenía un diccionario y con la ayuda de SO, lo convertí en una matriz.

array1 = ([[[36, 16], [48, 24], [12, 4], [12, 4]], [[48, 24], [64, 36], [16, 6], [16, 6]], [[12, 4], [16, 6], [ 4, 1], [ 4, 1]], [[12, 4], [16, 6], [ 4, 1], [ 4, 1]]]) 

Para practicar el uso del solucionador de matrices, la matriz se convirtió en una matriz cuadrada (4 x 4) utilizando:

  array_matrix_sized = array[:, :, 0] 

Leí que esto significa [número de índices, filas, columnas]. No tengo ni idea de por qué [:,:, 0] devuelve una matriz de 4 x 4. Para intentar ayudar, hice una matriz que tiene una longitud de 100, y he estado tratando de convertirla en una matriz de 10 x 10 de una manera similar sin éxito. Lo que me echa fuera es el número de filas es “:” y el número de columnas es “0”, si leo este concepto correctamente. Para una matriz de 4 x 4, ¿por qué no es array [:, 4, 4]? También asumo que: es porque estoy interesado en todos los valores.

Gracias de antemano por cualquier ayuda / consejo. Me disculpo si esta es una pregunta simple, pero realmente podría usar la aclaración sobre cómo funciona esto.

Todavía no es del todo comprensivo. Si tengo

  array2 = array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199]) 

Para integrarlo en una matriz de 10 X 10, intenté usar array2 [:,:, 0] y obtuve el error IndexError: demasiados índices para la matriz. ¿No es esto similar a mi primer ejemplo?

Leí que esto significa [número de índices, filas, columnas]. […] Lo que me echa fuera es que el número de filas es “:” y el número de columnas es “0”, si leo este concepto correctamente.

No. Significa [qué partes quiero en la dimensión 1, qué partes quiero en la dimensión 2, qué partes quiero en la dimensión 3]. Los índices no son la cantidad de filas / columnas que desea, son las que desea. Y, como dijiste : significa “todos” en este contexto.

Para una matriz de 4 x 4, ¿por qué no es array [:, 4, 4]?

No especificas la forma del resultado. La forma del resultado depende de la forma de la matriz original. Dado que su matriz es 4x4x2, obtener un elemento en la última dimensión le da 4×4. Si la matriz era 8x7x2, entonces [:, :, 0] le daría un resultado de 8×7.

Entonces [:, :, 0] significa “dame todo en las primeras dos dimensiones, pero solo el primer elemento en la última dimensión. Esto equivale a obtener el primer elemento de cada” fila “(o la primera” columna “, ya que aparece en la pantalla) por lo que obtiene el resultado que obtiene:

 >>> array1[:, :, 0] array([[36, 48, 12, 12], [48, 64, 16, 16], [12, 16, 4, 4], [12, 16, 4, 4]]) 

Del mismo modo, hacer [0, :, :] te da el primer “fragmento”:

 >>> array1[0, :, :] array([[36, 16], [48, 24], [12, 4], [12, 4]]) 

Y haciendo [:, 0, :] te da la primera fila de cada fragmento:

 >>> x[:, 0, :] array([[36, 16], [48, 24], [12, 4], [12, 4]]) 

Solo quería añadir un ejemplo de aclaración:

 >>> np.arange(4*4*2).reshape(4,4,2) array([[[ 0, 1], [ 2, 3], [ 4, 5], [ 6, 7]], [[ 8, 9], [10, 11], [12, 13], [14, 15]], [[16, 17], [18, 19], [20, 21], [22, 23]], [[24, 25], [26, 27], [28, 29], [30, 31]]]) 

Ya que estamos en tres dimensiones, todavía podemos mantener una metáfora espacial. Imagina que estas rodajas 4X2 se astackn unas contra otras, frente a ti, en orden (como si fueran libros). Es decir, tomamos el primero y lo apoyamos como un libro, el segundo detrás de él y así sucesivamente. Elegimos la primera parte de la primera dimensión, y simplemente nos devuelve el primer “libro”:

 >>> a[0,:,:] array([[0, 1], [2, 3], [4, 5], [6, 7]]) 

Ahora mire la diferencia entre eso y la primera parte de la segunda dimensión:

 >>> a[:,0,:] array([[ 0, 1], [ 8, 9], [16, 17], [24, 25]]) 

Esto es como cortar la parte superior. Imagina que te afeitas la parte superior. Sucede que con la matriz que publicaste, ¡estas son las mismas!

Ahora, finalmente, la primera parte de la tercera dimensión:

 >>> a[:,:,0] array([[ 0, 2, 4, 6], [ 8, 10, 12, 14], [16, 18, 20, 22], [24, 26, 28, 30]]) 

Esto es como cortar por la mitad lo que tienes frente a ti: imagina un golpe de karate.

Aquí hay una imagen (muy burda) (dibujada en mi laptop … lo siento). introduzca la descripción de la imagen aquí

La analogía del libro es buena, pero tiendo a organizar mis matrices en un orden ligeramente diferente. Si consideramos la siguiente matriz de datos …

 a = np.arange(2*3*4).reshape(2,3,4) array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]) 

Para mí, lo anterior se lee como 2 páginas, una encima de la otra. Cada página tiene 3 filas y hay 4 palabras en cada fila.

Escribí una función para tomar la misma información y organizarla lado a lado ya que esta es la forma en que tiendo a organizar las cosas en las que estoy trabajando. (Los detalles no son relevantes aquí …). Aquí está el reordenamiento con fines visuales …

 a = np.arange(2*3*4).reshape(2,3,4) Array... shape (2, 3, 4), ndim 3, not masked 0, 1, 2, 3 12, 13, 14, 15 4, 5, 6, 7 16, 17, 18, 19 8, 9, 10, 11 20, 21, 22, 23 sub (0) sub (1) a[0,:,:] array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) a[:,0,:] array([[ 0, 1, 2, 3], [12, 13, 14, 15]]) >>> a[:,:,0] array([[ 0, 4, 8], [12, 16, 20]]) 

Entonces, en mi caso, la secuencia de un [0,:,:], un [:, 0 ,:] a un [:,:, 0] sigue la página de la secuencia, la fila y la palabra.

Las personas pueden argumentar desde una perspectiva diferente, pero creo que es importante darse cuenta de que no todas las personas ven las cosas de la misma manera. A menudo trabajo con imágenes. Prefiero la disposición anterior de (imagen, fila, columna) que es equivalente a la notación (página, fila, palabra).

Tenga en cuenta … si no le gusta la apariencia de una matriz, o si no funciona para usted … simplemente intercambie los ejes.

 a.swapaxes(2,0) array([[[ 0, 12], [ 4, 16], [ 8, 20]], [[ 1, 13], [ 5, 17], [ 9, 21]], [[ 2, 14], [ 6, 18], [10, 22]], [[ 3, 15], [ 7, 19], [11, 23]]]) 

¿Todavía no lo sientes? … intenta un arreglo diferente hasta que haga clic o simplifique tus cálculos.

código s=np.arange(Total no. of matrices * number of rows * number of columns).reshape(Total no. of matrices * number of rows * number of columns) .Ejemplo si el código es rameez=np.arange(5*4*4).reshape(5,4,4) [[5 = Nº total de matrices a generar]]. [[4 * 4 es la matriz dimensional 4 * 4]]. Aquí obtendremos 5 matrices cada una de los cuales es 4 * 4 matriz dimensional. Código rameez=np.arange(10*3*2).reshape(10,3,2) generará 10 matrices en conjunto con cada una de las dimensiones ((3 * 2)).