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

420

Una matriz numpy se puede remodelar en un vector usando la función de remodelación con el parámetro -1. Pero no sé qué significa -1 aquí.

Por ejemplo:

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

El resultado de bes:matrix([[1, 2, 3, 4, 5, 6, 7, 8]])

¿Alguien sabe lo que significa -1 aquí? Y parece que Python asigna -1 varios significados, tales como: array[-1]significa el último elemento. ¿Puedes dar una explicación?

usuario2262504
fuente

Respuestas:

568

El criterio a 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 se dé cuenta. Y numpy calculará esto mirando la 'longitud de la matriz y las dimensiones restantes' y asegurándose de que cumpla con los criterios mencionados anteriormente

Ahora mira el ejemplo.

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

Ahora tratando de remodelar con (-1). El resultado de la nueva forma 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 tratando de remodelar con (-1, 1). Hemos proporcionado la columna como 1 pero las filas como desconocidas. Entonces obtenemos resultados con una nueva forma como (12, 1). De nuevo 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 consistente con el numpymensaje de aviso / error, para usar reshape(-1,1)para una sola característica; es decir, una sola columna

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

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

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

Ahora tratando de mantener la columna como desconocida. Nueva forma como (1, -1). es decir, fila es 1, columna desconocida. obtenemos resultado 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 consistente con el numpymensaje de aviso / error, para usar reshape(1,-1)para una sola muestra; es decir, una sola fila

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

Nueva forma (2, -1). Fila 2, columna desconocida. obtenemos 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 resultado 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 como 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
fuente
11
Esta respuesta contiene muchos ejemplos, pero no describe lo que -1 hace en inglés simple. Al remodelar una matriz, la nueva forma debe contener el mismo número de elementos que la forma anterior, lo que significa que los productos de las dimensiones de las dos formas deben ser iguales. Cuando se utiliza un -1, la dimensión correspondiente a -1 será el producto de las dimensiones de la matriz original dividido por el producto de las dimensiones dadas reshapepara mantener el mismo número de elementos.
BallpointBen
1
En mi opinión, la respuesta aceptada y esta respuesta son útiles, mientras que la respuesta aceptada es más simple, prefiero la respuesta más simple
cloudcomputes
1
¿Cómo es la forma (12, 1) "compatible" con la forma (3,4)?
Vijender
1
@Vijender Supongo que significa la misma cantidad de elementos pero diferentes ejes, es decir, 12x1 == 3x4.
David Waterworth
80

Se usa para remodelar una matriz.

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 arregla el primer dim = 5 y el segundo dim = 5, no necesita determinar la tercera dimensión. Para ayudar a su pereza, python le da la opción de -1:

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

le dará una matriz de forma = (5, 5, 8).

Igualmente,

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

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

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

Anuj Gupta
fuente
59

De acuerdo a the documentation:

newshape: int o tupla de ints

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

falsetru
fuente
En este caso, se infiere que el valor es [1, 8]. Y 8 es el número total de matriz a. ¿Correcto?
user2262504
@ user2262504, no estoy seguro. Creo que el valor inferido se [8]debe a que la documentación lo dice ( 1-D array). Tratar numpy.reshape(a, [8]). Produce el mismo resultado numpy.reshape(a, [1,8])para la matriz.
falsetru
3
-1 permite que numpy determine por usted el número desconocido de columnas o filas en la matriz resultante. Nota: lo desconocido debe ser columnas o filas, no ambas.
Gathide
15

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 ejemplo a continuación, mencionó que la salida explica que el vector resultante sea una sola fila. (- 1) indica el número de filas a ser 1. si el

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

salida:

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

Esto puede explicarse más precisamente con otro ejemplo:

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

salida: (es una matriz de columnas unidimensional)

matriz ([[0],

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

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

salida: (es un conjunto de filas de 1 dimensión)

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

Dinesh Kumar
fuente
12

Es bastante fácil de entender. El "-1" significa "dimensión desconocida" que se puede inferir desde otra dimensión. En este caso, si configura su matriz de esta manera:

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

Modifique su matriz así:

b = numpy.reshape(a, -1)

Llamará a algunas operaciones sordas a la matriz a, que devolverá una matriz numpy / martrix 1-d.

Sin embargo, no creo que sea una buena idea usar un código como este. ¿Por qué no intentarlo?

b = a.reshape(1,-1)

Le dará el mismo resultado y es más claro para que los lectores lo entiendan: establezca b como otra forma de a. Por un lado, no sabemos cuántas columnas debería tener (¡configúrelo en -1!), Pero queremos una matriz de 1 dimensión (¡establezca el primer parámetro en 1!).

F0rge1cE
fuente
9

Larga historia corta : establece algunas dimensiones y deja que NumPy establezca el (los) resto (s).

(userDim1, userDim2, ..., -1) -->>

(userDim1, userDim1, ..., TOTAL_DIMENSION - (userDim1 + userDim2 + ...))
Shayan Amani
fuente
Esta es la respuesta en inglés que estaba buscando, simple y llanamente. es decir, le das preferencia a tu diseño, deja que Numpy resuelva las matemáticas restantes :)
Sumanth Lazarus
6

Simplemente significa que no está seguro de qué número de filas o columnas puede dar y está pidiendo a numpy que sugiera el número de columnas o filas para remodelar.

numpy proporciona el último ejemplo para -1 https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

verifique el código a continuación y su salida para comprender mejor acerca de (-1):

CÓDIGO:-

import numpy
a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])
print("Without reshaping  -> ")
print(a)
b = numpy.reshape(a, -1)
print("HERE We don't know about what number we should give to row/col")
print("Reshaping as (a,-1)")
print(b)
c = numpy.reshape(a, (-1,2))
print("HERE We just know about number of columns")
print("Reshaping as (a,(-1,2))")
print(c)
d = numpy.reshape(a, (2,-1))
print("HERE We just know about number of rows")
print("Reshaping as (a,(2,-1))")
print(d)

SALIDA: -

Without reshaping  -> 
[[1 2 3 4]
 [5 6 7 8]]
HERE We don't know about what number we should give to row/col
Reshaping as (a,-1)
[[1 2 3 4 5 6 7 8]]
HERE We just know about number of columns
Reshaping as (a,(-1,2))
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
HERE We just know about number of rows
Reshaping as (a,(2,-1))
[[1 2 3 4]
 [5 6 7 8]]
Lobo solitario
fuente
2
import numpy as np
x = np.array([[2,3,4], [5,6,7]]) 

# Convert any shape to 1D shape
x = np.reshape(x, (-1)) # Making it 1 row -> (6,)

# When you don't care about rows and just want to fix number of columns
x = np.reshape(x, (-1, 1)) # Making it 1 column -> (6, 1)
x = np.reshape(x, (-1, 2)) # Making it 2 column -> (3, 2)
x = np.reshape(x, (-1, 3)) # Making it 3 column -> (2, 3)

# When you don't care about columns and just want to fix number of rows
x = np.reshape(x, (1, -1)) # Making it 1 row -> (1, 6)
x = np.reshape(x, (2, -1)) # Making it 2 row -> (2, 3)
x = np.reshape(x, (3, -1)) # Making it 3 row -> (3, 2)
Sherzod
fuente
0

El resultado final de la conversión es que el número de elementos en la matriz final es el mismo que el de la matriz inicial o el marco de datos.

-1 corresponde al recuento desconocido de la fila o columna. podemos pensar en ello como x(desconocido). xse obtiene dividiendo el número de elementos en la matriz original por el otro valor del par ordenado con -1.

Ejemplos

12 elementos con remodelación (-1,1) corresponden a una matriz con x= 12/1 = 12 filas y 1 columna.


12 elementos con remodelación (1, -1) corresponden a una matriz con 1 fila y x= 12/1 = 12 columnas.

deepjyoti22
fuente