¿Qué significa -1 en la remodelación numpy?

Resuelto user2262504 asked hace 11 años • 0 respuestas

Una matriz 2D se puede transformar en una matriz 1D usando .reshape(-1). Por ejemplo:

>>> a = numpy.array([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> a.reshape(-1)
array([[1, 2, 3, 4, 5, 6, 7, 8]])

Por lo general, array[-1]significa el último elemento. Pero ¿qué significa -1 aquí?

user2262504 avatar Sep 09 '13 10:09 user2262504
Aceptado

El criterio que se debe cumplir para proporcionar la nueva forma es que "la nueva forma debe ser compatible con la forma original".

numpy nos permite dar uno de los nuevos parámetros de forma como -1 (por ejemplo: (2,-1) o (-1,3) pero no (-1, -1)). Simplemente significa que es una dimensión desconocida y queremos que numpy la descubra. Y numpy resolverá esto observando la "longitud de la matriz y las dimensiones restantes" y asegurándose de que satisfaga los criterios mencionados anteriormente.

Ahora vea el ejemplo.

z = np.array([[1, 2, 3, 4],
         [5, 6, 7, 8],
         [9, 10, 11, 12]])
z.shape
(3, 4)

Ahora intentando remodelar con (-1) . La nueva forma resultante es (12,) y es compatible con la forma original (3,4)

z.reshape(-1)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

Ahora intentando remodelar con (-1, 1). Hemos proporcionado la columna como 1 pero las filas como desconocidas. Entonces obtenemos el resultado de una nueva forma como (12, 1). Nuevamente compatible con la forma original (3,4)

z.reshape(-1,1)
array([[ 1],
   [ 2],
   [ 3],
   [ 4],
   [ 5],
   [ 6],
   [ 7],
   [ 8],
   [ 9],
   [10],
   [11],
   [12]])

Lo anterior es coherente con numpyel consejo/mensaje de error, para utilizar reshape(-1,1)en una sola función; es decir, una sola columna

Cambie la forma de sus datos array.reshape(-1, 1)si sus datos tienen una sola característica

Nueva forma como (-1, 2). fila desconocida, columna 2. obtenemos el resultado nueva forma como (6, 2)

z.reshape(-1, 2)
array([[ 1,  2],
   [ 3,  4],
   [ 5,  6],
   [ 7,  8],
   [ 9, 10],
   [11, 12]])

Ahora intento mantener la columna como desconocida. Nueva forma como (1,-1). es decir, la fila es 1 y la columna es desconocida. obtenemos el resultado de una nueva forma como (1, 12)

z.reshape(1,-1)
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]])

Lo anterior es coherente con numpyel consejo/mensaje de error, para utilizar reshape(1,-1)en una sola muestra; es decir, una sola fila

Cambie la forma de sus datos array.reshape(1, -1)si contienen una sola muestra

Nueva forma (2, -1). Fila 2, columna desconocida. obtenemos el resultado nueva forma como (2,6)

z.reshape(2, -1)
array([[ 1,  2,  3,  4,  5,  6],
   [ 7,  8,  9, 10, 11, 12]])

Nueva forma como (3, -1). Fila 3, columna desconocida. obtenemos el resultado de una nueva forma como (3,4)

z.reshape(3, -1)
array([[ 1,  2,  3,  4],
   [ 5,  6,  7,  8],
   [ 9, 10, 11, 12]])

Y finalmente, si intentamos proporcionar ambas dimensiones desconocidas, es decir, una nueva forma como (-1,-1). arrojará un error

z.reshape(-1, -1)
ValueError: can only specify one unknown dimension
Julu Ahamed avatar Feb 28 '2017 13:02 Julu Ahamed

Digamos que tenemos una matriz tridimensional de dimensiones 2 x 10 x 10:

r = numpy.random.rand(2, 10, 10) 

Ahora queremos remodelar a 5 X 5 x 8:

numpy.reshape(r, shape=(5, 5, 8)) 

hará el trabajo.

Tenga en cuenta que, una vez que arregle la primera dim = 5y la segunda dim = 5, no necesita determinar la tercera dimensión. Para ayudar con su pereza, Numpy le ofrece la opción de utilizar -1:

numpy.reshape(r, shape=(5, 5, -1)) 

le dará una variedad de shape = (5, 5, 8).

Asimismo,

numpy.reshape(r, shape=(50, -1)) 

te dará una matriz de forma = (50, 4)

Puedes leer más en http://anie.me/numpy-reshape-transpose-theano-dimshuffle/

Anuj Gupta avatar Mar 22 '2017 11:03 Anuj Gupta

De acuerdo a the documentation:

nueva forma: int o tupla de enteros

La nueva forma debe ser compatible con la forma original. Si es un número entero, el resultado será una matriz unidimensional de esa longitud. Una dimensión de forma puede ser -1. En este caso, el valor se deduce de la longitud de la matriz y las dimensiones restantes.

falsetru avatar Sep 09 '2013 03:09 falsetru
numpy.reshape(a,newshape,order{})

consulte el siguiente enlace para obtener más información. https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

Para el siguiente ejemplo que mencionaste, la salida explica que el vector resultante es una sola fila. (-1) indica que el número de filas es 1. Si el

a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])
b = numpy.reshape(a, -1)

producción:

matrix([[1, 2, 3, 4, 5, 6, 7, 8]])

Esto se puede explicar más precisamente con otro ejemplo:

b = np.arange(10).reshape((-1,1))

salida: (es una matriz de columnas unidimensional)

array([[0],
       [1],
       [2],
       [3],
       [4],
       [5],
       [6],
       [7],
       [8],
       [9]])

o

b = np.arange(10).reshape((1,-1))

salida: (es una matriz de filas unidimensional)

array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
Dinesh Kumar avatar Jan 02 '2017 16:01 Dinesh Kumar