Che cosa significa -1 in rimodellamento numpy?


420

Una matrice intorpidita può essere rimodellata in un vettore utilizzando la funzione di risagoma con il parametro -1. Ma non so cosa significhi -1 qui.

Per esempio:

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

Il risultato di bè:matrix([[1, 2, 3, 4, 5, 6, 7, 8]])

Qualcuno sa cosa significa -1 qui? E sembra che Python assegni -1 diversi significati, come ad esempio: array[-1]significa l'ultimo elemento. Puoi dare una spiegazione?

Risposte:


568

Il criterio da soddisfare per fornire la nuova forma è che "La nuova forma dovrebbe essere compatibile con la forma originale"

numpy ci permette di dare uno dei nuovi parametri di forma come -1 (es: (2, -1) o (-1,3) ma non (-1, -1)). Significa semplicemente che si tratta di una dimensione sconosciuta e vogliamo che numpy lo capisca. E numpy lo capirà guardando la 'lunghezza dell'array e le dimensioni rimanenti' e assicurandosi che soddisfi i criteri sopra menzionati

Ora vedi l'esempio.

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

Ora provo a rimodellare con (-1). Risultato la nuova forma è (12,) ed è compatibile con la forma originale (3,4)

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

Ora provo a rimodellare con (-1, 1). Abbiamo fornito la colonna come 1 ma le righe come sconosciute. Quindi otteniamo una nuova forma come (12, 1). Di nuovo compatibile con la forma originale (3,4)

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

Quanto sopra è coerente con numpyil messaggio di avviso / errore, da utilizzare reshape(-1,1)per una singola funzione; cioè singola colonna

Rimodella i tuoi dati usando array.reshape(-1, 1)se i tuoi dati hanno una singola funzione

Nuova forma come (-1, 2). riga sconosciuta, colonna 2. otteniamo il risultato nuova forma come (6, 2)

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

Ora provo a mantenere la colonna sconosciuta. Nuova forma come (1, -1). vale a dire, la riga è 1, colonna sconosciuta. otteniamo una nuova forma come (1, 12)

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

Quanto sopra è coerente con numpyil messaggio di avviso / errore, da utilizzare reshape(1,-1)per un singolo campione; cioè fila singola

Rimodella i tuoi dati usando array.reshape(1, -1)se contiene un singolo campione

Nuova forma (2, -1). Riga 2, colonna sconosciuta. otteniamo una nuova forma come (2,6)

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

Nuova forma come (3, -1). Riga 3, colonna sconosciuta. otteniamo una nuova forma come (3,4)

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

E infine, se proviamo a fornire entrambe le dimensioni come sconosciute, ovvero nuova forma come (-1, -1). Si genererà un errore

z.reshape(-1, -1)
ValueError: can only specify one unknown dimension

11
Questa risposta contiene molti esempi ma non illustra ciò che -1 fa in un inglese semplice. Quando si rimodella una matrice, la nuova forma deve contenere lo stesso numero di elementi della vecchia forma, il che significa che i prodotti delle dimensioni delle due forme devono essere uguali. Quando si utilizza un -1, la dimensione corrispondente a -1 sarà il prodotto delle dimensioni dell'array originale diviso per il prodotto delle dimensioni assegnate in reshapemodo da mantenere lo stesso numero di elementi.
BallpointBen,

1
Secondo me la risposta accettata e questa risposta sono entrambe utili, mentre la risposta accettata è più semplice, preferisco la risposta più semplice
cloud calcola il

1
In che modo la forma (12, 1) è "compatibile" con la forma (3,4)?
Vijender,

1
@Vijender Immagino significhi lo stesso numero di elementi ma un asse diverso - ovvero 12x1 == 3x4?
David Waterworth,

80

Utilizzato per rimodellare un array.

Supponiamo di avere una matrice tridimensionale di dimensioni 2 x 10 x 10:

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

Ora vogliamo rimodellare in 5 X 5 x 8:

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

farà il lavoro.

Si noti che, una volta risolti il ​​primo dim = 5 e il secondo dim = 5, non è necessario determinare la terza dimensione. Per aiutare la tua pigrizia, Python offre l'opzione -1:

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

ti darà una matrice di forma = (5, 5, 8).

Allo stesso modo,

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

ti darà una matrice di forma = (50, 4)

Puoi leggere di più su http://anie.me/numpy-reshape-transpose-theano-dimshuffle/


59

Secondo the documentation:

newshape: int o tupla di ints

La nuova forma dovrebbe essere compatibile con la forma originale. Se un numero intero, il risultato sarà un array 1-D di quella lunghezza. Una dimensione della forma può essere -1. In questo caso, il valore viene dedotto dalla lunghezza dell'array e dalle dimensioni rimanenti.


In questo caso, si deduce che il valore è [1, 8]. E 8 è il numero totale di matrici a. destra?
user2262504

@ user2262504, non sono sicuro. Penso che il valore inferito sia [8]perché la documentazione lo dice ( 1-D array). Prova numpy.reshape(a, [8]). Produce lo stesso risultato con numpy.reshape(a, [1,8])per la matrice.
falsetru,

3
-1 consente a numpy di determinare per te il numero sconosciuto di colonne o righe nella matrice risultante. Nota: l'ignoto dovrebbe essere colonne o righe, non entrambi.
Gathide,

15

numpy.reshape (a, newshape, order {}) controlla il link qui sotto per maggiori informazioni. https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

per l'esempio seguente hai menzionato l'output spiega che il vettore risultante è una singola riga. (- 1) indica il numero di righe da 1. se il

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

produzione:

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

questo può essere spiegato più precisamente con un altro esempio:

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

output: (è un array colonnare 1 dimensionale)

array ([[0],

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

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

output: (è un array di righe 1 dimensionale)

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


12

È abbastanza facile da capire. "-1" sta per "dimensione sconosciuta" che può essere dedotta da un'altra dimensione. In questo caso, se imposti la tua matrice in questo modo:

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

Modifica la tua matrice in questo modo:

b = numpy.reshape(a, -1)

Chiamerà alcune operazioni sorde alla matrice a, che restituirà un array / martrix numpy 1-d.

Tuttavia, non credo sia una buona idea usare un codice come questo. Perché non provare:

b = a.reshape(1,-1)

Ti darà lo stesso risultato ed è più chiaro per i lettori capire: imposta b come un'altra forma di a. Per a, non abbiamo quante colonne dovrebbe avere (impostalo su -1!), Ma vogliamo un array a 1 dimensione (imposta il primo parametro su 1!).


9

Per farla breve : imposti alcune dimensioni e consenti a NumPy di ​​impostare i rimanenti.

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

(userDim1, userDim1, ..., TOTAL_DIMENSION - (userDim1 + userDim2 + ...))

Questa è la risposta in inglese che stavo cercando, chiara e semplice. cioè dai la tua preferenza di design, lascia intorpidire la matematica rimanente :)
Sumanth Lazarus

6

Significa semplicemente che non sei sicuro del numero di righe o colonne che puoi fornire e stai chiedendo a numpy di suggerire il numero di colonne o righe in cui rimodellare.

numpy fornisce l'ultimo esempio di -1 https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

controlla sotto il codice e il suo output per capire meglio (-1):

CODICE:-

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)

PRODUZIONE :-

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]]

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)

0

Il risultato finale della conversione è che il numero di elementi nell'array finale è uguale a quello dell'array iniziale o del frame di dati.

-1 corrisponde al conteggio sconosciuto della riga o della colonna. possiamo pensarlo come x(sconosciuto). xsi ottiene dividendo l'ombra di elementi nell'array originale per l'altro valore della coppia ordinata con -1.

Esempi

12 elementi con rimodella (-1,1) corrispondono a una matrice con x= 12/1 = 12 righe e 1 colonna.


12 elementi con rimodella (1, -1) corrispondono a una matrice con 1 riga e x= 12/1 = 12 colonne.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.