ndarray.shape
El atributo numpy.ndarray.shape devuelve una tupla con el tamaño del array, pero puede ser también usado para redimensionarlo. Tal y como ocurre con la función numpy.reshape, uno de los tamaños de las dimensiones puede ser -1, en cuyo caso el tamaño de dicha dimensión se infiere a partir del número de elementos del array y del tamaño del resto de dimensiones.
En este ejemplo tenemos un array numpy de una única dimensión, creado a partir de una lista con tres elementos:
import numpy as np
a = np.array([1, 2, 3])
print(a)
print(a.shape)
La coma -sin un número detrás- que devuelve el atributo indica que esa segunda dimensión no está definida (la coma sirve para especificar que se trata de una tupla -aunque solo tenga un elemento- en lugar de un número entero).
En este segundo ejemplo el array numpy se forma a partir de una lista con un único elemento: una lista (a su vez) de tres elementos. Esto se interpreta como una fila (pues había un único elemento en la lista original) y tres columnas:
import numpy as np
a = np.array([[1, 2, 3]])
print(a)
print(a.shape)
El tamaño del array numpy es (1, 3): una fila y tres columnas.
Si la lista a partir de la que se crea el numpy array contiene, no una, sino tres listas, cada una con un único elemento, se interpretaría como tres filas y una única columna:
import numpy as np
a = np.array([[1], [2], [3]])
print(a)
print(a.shape)
En este caso el tamaño del array numpy es (3, 1): tres filas y una columna.
Si la lista a partir de la que se crea el numpy array contiene dos sublistas, cada una con tres elementos, se interpreta como dos filas y tres columnas:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
print(a.shape)
Ahora, el tamaño del array es (2, 3): dos filas (pues la lista original tenía dos subfilas) y tres columnas (cada subfila tenía tres elementos).
Podemos crear un numpy array de tres dimensiones si, en el escenario anterior, sustituimos cada uno de los elementos del nivel inferior por una nueva lista:
import numpy as np
a = np.array([
[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
[[10, 11, 12], [13, 14, 15], [16, 17, 18]]])
print(a)
En este caso, el array numpy se forma a partir de una lista con dos elementos (dos sublistas), lo que se interpreta como dos elementos en la primera dimensión (filas), cada una de ellas formada por otras tres sublistas, lo que se interpreta como tres elementos en la segunda dimensión (columnas), cada una de ellas formada por tres elementos, lo que se interpreta como tres elementos en la tercera dimensión (profundidad).
Podemos utilizar el atributo para redimensionar un array numpy. Por ejemplo, en este caso partimos de un array de una única dimensión y seis elementos, y lo convertimos en un array de dos dimensiones de tamaño (3, 2):
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
print(a)
print(a.shape)
a.shape = (3, 2)
print(a)
print(a.shape)
Si, al redimensionar el array, utilizamos el valor -1 para especificar el tamaño de una dimensión, este tamaño se infiere a partir del número de elementos y del tamaño de las otras dimensiones. Si, como en este caso, tenemos seis elementos y se fija el tamaño de la segunda dimensión en tres, la primera dimensión deberá tener un tamaño de 2:
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
print(a)
print(a.shape)
a.shape = (-1, 3)
print(a)
print(a.shape)
En este ejemplo, partimos de un array numpy de dos dimensiones y tamaño (2, 3) y lo convertimos en un array numpy de una única dimensión. Para ello fijamos el nuevo tamaño en (-1, ) -también podríamos haber usado como nuevo tamaño (6, ), o (-1) o (6), sin especificar que se trata de una tupla-:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
print(a.shape)
a.shape = (-1, )
print(a)
print(a.shape)