Información: https://stackoverflow.com/questions/22053050/difference-between-numpy-array-shape-r-1-and-r
Este artículo es una pregunta sobre stackoverflow que abrí accidentalmente. Se trata del objeto de matriz en numpy. No hace falta decir que la importante posición de numpy en el mundo del pitón y el aprendizaje automático. Traduce esta respuesta aquí para comprenderla para aprender.
Nota: La traducción es solo para fines de aprendizaje. El autor es Gareth Rees y puede tener mis propias modificaciones.
¡Solo con fines de aprendizaje!
La mejor manera de ver los arreglos NumPy es dividirlo en dos partes, un búfer de datos contiene un elemento sin procesar (elemento original) y una vista (lo llamo ventana) para describir e interpretar el búfer de datos.
Por ejemplo, si creamos una matriz a que contenga 12 enteros :
>>> a = numpy.arange (12) >>> una matriz ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
Luego, a contiene un búfer de datos, almacenado de la siguiente manera:
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬──── ┬────┬────┐ │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │ └────┴────┴─── ─┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
Y una ventana que define cómo interpretar los datos:
>>> a.flags C_CONTIGUOUS: True F_CONTIGUOUS: True DATOS PROPIOS: True WRITEABLE: True ALINEADO: True UPDATEIFCOPY: False >>> a.dtype dtype ('int64') >>> a.itemsize 8 >>> a.strides ( 8,) >>> una forma (12,)
Aquí, shape = (12,) significa que la matriz está dominada por un solo índice: de 0 a 11. Conceptualmente, si utilizamos este índice por separado a una etiqueta marcada, a continuación, un mirar lo desea:
i = 0 1 2 3 4 5 6 7 8 9 10 11 ┌────┬────┬────┬────┬────┬────┬────┬ ────┬────┬────┬────┬────┐ │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │ └────┴────┴────┴────┴────┴────┴────┴────┴────┴──── ┴────┴────┘
La operación de remodelar una matriz no cambia el búfer de datos, pero crea una nueva ventana para interpretar los datos.
>>> b = a.reshape ((3, 4))
La operación anterior crea un b que tiene el mismo búfer de datos que a , pero ahora está dominado por dos dimensiones indexadas. Uno de 0 a 2 y uno de 0 a 3. Si etiquetamos los datos, b se verá así:
i = 0 0 0 0 1 1 1 1 2 2 2 2 j = 0 1 2 3 0 1 2 3 0 1 2 3 ┌────┬────┬────┬────┬─ ───┬────┬────┬────┬────┬────┬────┬────┐ │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │ └────┴────┴────┴────┴────┴────┴────┴ ────┴────┴────┴────┴────┘
Esto también significa:
>>> b [2,1] 9
El segundo índice cambia más rápido que el primer índice. Si desea invertir, puede usar los siguientes parámetros para crear una matriz c
>>> c = a.reshape ((3, 4), orden = 'F')
Suplemento: order = 'F' u order = 'C' significa que la indexación de matrices es como lenguaje C o Fortran, respectivamente, y 'C' es el valor predeterminado
Esto producirá una matriz con los siguientes índices:
i = 0 1 2 0 1 2 0 1 2 0 1 2 j = 0 0 0 1 1 1 2 2 2 3 3 3 ┌────┬────┬────┬────┬─ ───┬────┬────┬────┬────┬────┬────┬────┐ │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │ └────┴────┴────┴────┴────┴────┴────┴ ────┴────┴────┴────┴────┘
Significado
>>> c [2,1] 5
Con la ropa de cama anterior, es fácil entender el siguiente ejemplo:
>>> d = a.reshape ((12, 1))
La matriz d está dominada por dos índices, el primer índice es de 0 a 11 y el segundo índice siempre es 0:
i = 0 1 2 3 4 5 6 7 8 9 10 11 j = 0 0 0 0 0 0 0 0 0 0 0 0 ┌────┬────┬────┬────┬─ ───┬────┬────┬────┬────┬────┬────┬────┐ │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │ └────┴────┴────┴────┴────┴────┴────┴ ────┴────┴────┴────┴────┘
Entonces
>>> d [10,0] 10
Una matriz unidimensional aplanada es libre en cierto sentido, por lo que podemos definir el tamaño de cada dimensión nosotros mismos:
>>> e = a.reshape ((1, 2, 1, 6, 1))
La operación anterior crea una matriz como esta:
i = 0 0 0 0 0 0 0 0 0 0 0 0 j = 0 0 0 0 0 0 1 1 1 1 1 1 k = 0 0 0 0 0 0 0 0 0 0 0 0 l = 0 1 2 3 4 5 0 1 2 3 4 5 m = 0 0 0 0 0 0 0 0 0 0 0 0 ┌────┬────┬────┬────┬────┬──── ┬────┬────┬────┬────┬────┬────┐ │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │ └────┴────┴────┴────┴────┴────┴────┴────┴─── ─┴────┴────┴────┘
Entonces
>>> e [0,1,0,0,0] 6