O que significa -1 na remodelação numpy?

420

Uma matriz numpy pode ser remodelada em um vetor usando a função remodelar com o parâmetro -1. Mas não sei o que -1 significa aqui.

Por exemplo:

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

O resultado bé:matrix([[1, 2, 3, 4, 5, 6, 7, 8]])

Alguém sabe o que -1 significa aqui? E parece que o python atribui -1 vários significados, como: array[-1]significa o último elemento. Você pode dar uma explicação?

user2262504
fonte

Respostas:

568

O critério a ser cumprido para fornecer a nova forma é que 'A nova forma deve ser compatível com a forma original'

numpy nos permite fornecer um dos novos parâmetros de forma como -1 (por exemplo: (2, -1) ou (-1,3), mas não (-1, -1)). Significa simplesmente que é uma dimensão desconhecida e queremos que fique entorpecido. E numpy descobrirá isso analisando o 'comprimento da matriz e as dimensões restantes' e garantindo que ele atenda aos critérios mencionados acima

Agora veja o exemplo.

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

Agora tentando remodelar com (-1). A nova forma do resultado é (12,) e é compatível com a forma original (3,4)

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

Agora tentando remodelar com (-1, 1). Fornecemos a coluna como 1, mas as linhas como desconhecidas. Portanto, obtemos o resultado de uma nova forma como (12, 1). Novamente compatível com a forma original (3,4)

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

O acima é consistente com a numpymensagem de aviso / erro, para usar reshape(-1,1)em um único recurso; ou seja, coluna única

Remodelar seus dados usando array.reshape(-1, 1)se os dados tiverem um único recurso

Nova forma como (-1, 2). linha desconhecida, coluna 2. obtemos o resultado em nova forma como (6, 2)

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

Agora, tentando manter a coluna como desconhecida. Nova forma como (1, -1). ou seja, linha é 1, coluna desconhecida. obtemos resultado nova forma como (1, 12)

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

O acima é consistente com a numpymensagem de aviso / erro, para usar reshape(1,-1)em uma única amostra; ou seja, linha única

Remodelar seus dados usando array.reshape(1, -1)se contiver uma única amostra

Nova forma (2, -1). Linha 2, coluna desconhecida. obtemos resultado nova forma como (2,6)

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

Nova forma como (3, -1). Linha 3, coluna desconhecida. obtemos resultado nova forma como (3,4)

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

E, finalmente, se tentarmos fornecer ambas as dimensões como desconhecidas, ou seja, uma nova forma como (-1, -1). Irá gerar um erro

z.reshape(-1, -1)
ValueError: can only specify one unknown dimension
Julu Ahamed
fonte
11
Essa resposta contém muitos exemplos, mas não mostra o que -1 faz em inglês simples. Ao remodelar uma matriz, a nova forma deve conter o mesmo número de elementos que a forma antiga, o que significa que os produtos das dimensões das duas formas devem ser iguais. Ao usar -1, a dimensão correspondente a -1 será o produto das dimensões da matriz original divididas pelo produto das dimensões fornecidas, de reshapemodo a manter o mesmo número de elementos.
precisa
1
Na minha opinião a resposta aceito e esta resposta é tanto útil, ao passo que a resposta aceita é mais simples, eu prefiro a resposta mais simples
cloudscomputes
1
Como a forma (12, 1) é "compatível" com a forma (3,4)?
Vijender
1
@ Vijender Acho que significa o mesmo número de elementos, mas eixos diferentes - ie 12x1 == 3x4?
David Waterworth
80

Usado para remodelar uma matriz.

Digamos que temos uma matriz tridimensional de dimensões 2 x 10 x 10:

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

Agora, queremos remodelar para 5 x 5 x 8:

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

fará o trabalho.

Observe que, depois de corrigir a primeira dim = 5 e a segunda dim = 5, você não precisa determinar a terceira dimensão. Para ajudar sua preguiça, python oferece a opção -1:

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

lhe dará uma matriz de forma = (5, 5, 8).

Da mesma forma,

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

lhe dará uma matriz de forma = (50, 4)

Você pode ler mais em http://anie.me/numpy-reshape-transpose-theano-dimshuffle/

Anuj Gupta
fonte
59

De acordo com the documentation:

newshape: int ou tupla de ints

A nova forma deve ser compatível com a forma original. Se um número inteiro, o resultado será uma matriz 1-D desse comprimento. Uma dimensão de forma pode ser -1. Nesse caso, o valor é inferido a partir do comprimento da matriz e das dimensões restantes.

falsetru
fonte
Nesse caso, o valor é inferido como sendo [1, 8]. E 8 é o número total de matrizes a. direita?
user2262504
@ user2262504, não tenho certeza. Eu acho que o valor inferido é [8]porque a documentação diz isso ( 1-D array). Tente numpy.reshape(a, [8]). Ele produz o mesmo resultado numpy.reshape(a, [1,8])para a matriz.
falsetru 9/09/13
3
-1 permite que numpy determine para você o número desconhecido de colunas ou linhas na matriz resultante. Nota: o desconhecido deve ser colunas ou linhas, não ambas.
Gathide
15

numpy.reshape (a, newshape, order {}), verifique o link abaixo para obter mais informações. https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

para o exemplo abaixo, você mencionou que a saída explica que o vetor resultante é uma única linha. (- 1) indica o número de linhas como 1. se o

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

resultado:

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

isso pode ser explicado mais precisamente com outro exemplo:

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

output: (é uma matriz colunar unidimensional)

matriz ([[0],

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

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

output: (é uma matriz de linhas unidimensionais)

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

Dinesh Kumar
fonte
12

É bastante fácil de entender. O "-1" significa "dimensão desconhecida", que pode ser deduzida de outra dimensão. Nesse caso, se você definir sua matriz assim:

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

Modifique sua matriz assim:

b = numpy.reshape(a, -1)

Ele chamará algumas operações de surdez para a matriz a, que retornará uma matriz numpy 1-d / martrix.

No entanto, não acho que seja uma boa ideia usar código como este. Por que nao tentar:

b = a.reshape(1,-1)

Ele fornecerá o mesmo resultado e é mais claro para os leitores entenderem: Defina b como outra forma de a. Para a, não sabemos quantas colunas ele deve ter (defina-o como -1!), Mas queremos uma matriz de 1 dimensão (defina o primeiro parâmetro como 1!).

F0rge1cE
fonte
9

Para encurtar a história : você define algumas dimensões e deixa o NumPy definir o (s) restante (s).

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

(userDim1, userDim1, ..., TOTAL_DIMENSION - (userDim1 + userDim2 + ...))
Shayan Amani
fonte
Esta é a resposta em inglês que eu estava procurando, pura e simplesmente. ou seja, você dá a sua preferência design, deixar o trabalho numpy fora a matemática restante :)
Sumanth Lazarus
6

Significa simplesmente que você não tem certeza sobre o número de linhas ou colunas que pode fornecer e está pedindo ao numpy para sugerir o número de colunas ou linhas a serem remodeladas.

numpy fornece o último exemplo para -1 https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

verifique abaixo o código e sua saída para entender melhor sobre (-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)

RESULTADO :-

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 solitário
fonte
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
fonte
0

O resultado final da conversão é que o número de elementos na matriz final é igual ao número da matriz ou quadro de dados inicial.

-1 corresponde à contagem desconhecida da linha ou coluna. podemos pensar nisso como x(desconhecido). xé obtido dividindo o número de elementos na matriz original pelo outro valor do par ordenado com -1.

Exemplos

12 elementos com remodelagem (-1,1) correspondem a uma matriz com x= 12/1 = 12 linhas e 1 coluna.


12 elementos com remodelagem (1, -1) correspondem a uma matriz com 1 linha e x= 12/1 = 12 colunas.

deepjyoti22
fonte