Que signifie -1 dans la refonte numpy?


420

Une matrice numpy peut être remodelée en un vecteur en utilisant la fonction de remodelage avec le paramètre -1. Mais je ne sais pas ce que -1 signifie ici.

Par exemple:

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

Le résultat best de:matrix([[1, 2, 3, 4, 5, 6, 7, 8]])

Est-ce que quelqu'un sait ce que -1 signifie ici? Et il semble que python attribue -1 plusieurs significations, telles que: array[-1]signifie le dernier élément. Pouvez-vous donner une explication?

Réponses:


568

Le critère à satisfaire pour fournir la nouvelle forme est que «la nouvelle forme doit être compatible avec la forme d'origine»

numpy nous permet de donner l'un des nouveaux paramètres de forme comme -1 (par exemple: (2, -1) ou (-1,3) mais pas (-1, -1)). Cela signifie simplement que c'est une dimension inconnue et nous voulons que numpy la comprenne. Et numpy le comprendra en regardant la «longueur du tableau et les dimensions restantes» et en s'assurant qu'il satisfait aux critères mentionnés ci-dessus

Maintenant, voyez l'exemple.

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

Essayez maintenant de remodeler avec (-1). Résultat: la nouvelle forme est (12,) et est compatible avec la forme d'origine (3,4)

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

Essayez maintenant de remodeler avec (-1, 1). Nous avons fourni la colonne comme 1 mais les lignes comme inconnues. Nous obtenons donc un résultat de nouvelle forme comme (12, 1) .Compatible avec la forme d'origine (3,4)

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

Ce qui précède est cohérent avec les numpyconseils / messages d'erreur, à utiliser reshape(-1,1)pour une seule fonctionnalité; c'est-à-dire une seule colonne

Remodeler vos données en utilisant array.reshape(-1, 1)si vos données ont une seule fonctionnalité

Nouvelle forme comme (-1, 2). ligne inconnue, colonne 2. nous obtenons le résultat nouvelle forme comme (6, 2)

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

Essayez maintenant de garder la colonne inconnue. Nouvelle forme comme (1, -1). c'est-à-dire que la ligne est 1, la colonne est inconnue. nous obtenons une nouvelle forme de résultat comme (1, 12)

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

Ce qui précède est conforme aux numpyconseils / messages d'erreur, à utiliser reshape(1,-1)pour un seul échantillon; c'est-à-dire une seule rangée

Remodeler vos données en utilisant array.reshape(1, -1)si elles contiennent un seul échantillon

Nouvelle forme (2, -1). Ligne 2, colonne inconnue. on obtient le résultat nouvelle forme comme (2,6)

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

Nouvelle forme comme (3, -1). Ligne 3, colonne inconnue. on obtient le résultat nouvelle forme comme (3,4)

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

Et enfin, si nous essayons de fournir les deux dimensions comme inconnues, c'est-à-dire une nouvelle forme comme (-1, -1). Cela lancera une erreur

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

11
Cette réponse contient beaucoup d'exemples mais ne précise pas ce que -1 fait en anglais simple. Lors du remodelage d'un tableau, la nouvelle forme doit contenir le même nombre d'éléments que l'ancienne forme, ce qui signifie que les produits des dimensions des deux formes doivent être égaux. Lors de l'utilisation d'un -1, la dimension correspondant au -1 sera le produit des dimensions du tableau d'origine divisé par le produit des dimensions données reshapepour conserver le même nombre d'éléments.
BallpointBen

1
À mon avis, la réponse acceptée et cette réponse sont toutes deux utiles, alors que la réponse acceptée est plus simple, je préfère la réponse plus simple
cloudscomputes

1
Comment la forme (12, 1) est-elle "compatible" avec la forme (3,4)?
Vijender

1
@Vijender Je suppose que cela signifie le même nombre d'éléments mais un axe différent - c'est-à-dire 12x1 == 3x4?
David Waterworth

80

Utilisé pour remodeler un tableau.

Disons que nous avons un tableau en 3 dimensions de dimensions 2 x 10 x 10:

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

Maintenant, nous voulons remodeler en 5 X 5 x 8:

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

fera le travail.

Notez qu'une fois que vous fixez le premier dim = 5 et le deuxième dim = 5, vous n'avez pas besoin de déterminer la troisième dimension. Pour aider votre paresse, python donne l'option -1:

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

vous donnera un tableau de forme = (5, 5, 8).

Également,

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

vous donnera un tableau de forme = (50, 4)

Vous pouvez en savoir plus sur http://anie.me/numpy-reshape-transpose-theano-dimshuffle/


59

Selon the documentation:

newshape: int ou tuple d'ints

La nouvelle forme doit être compatible avec la forme d'origine. Si un entier, le résultat sera un tableau 1-D de cette longueur. Une dimension de forme peut être -1. Dans ce cas, la valeur est déduite de la longueur du tableau et des dimensions restantes.


Dans ce cas, la valeur est supposée être [1, 8]. Et 8 est le nombre total de matrice a. droite?
user2262504

@ user2262504, je ne suis pas sûr. Je pense que la valeur déduite est [8]parce que la documentation le dit ( 1-D array). Essayez numpy.reshape(a, [8]). Il donne le même résultat que numpy.reshape(a, [1,8])pour la matrice.
falsetru

3
-1 permet à numpy de déterminer pour vous le nombre inconnu de colonnes ou de lignes dans la matrice résultante. Remarque: l'inconnu doit être des colonnes ou des lignes, pas les deux.
Gathide

15

numpy.reshape (a, newshape, order {}) consultez le lien ci-dessous pour plus d'informations. https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

pour l'exemple ci-dessous, vous avez mentionné que la sortie explique que le vecteur résultant est une seule ligne. (- 1) indique le nombre de lignes à 1. si le

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

production:

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

cela peut être expliqué plus précisément avec un autre exemple:

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

sortie: (est un tableau en colonnes à 1 dimension)

tableau ([[0],

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

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

sortie: (est un tableau de lignes à 1 dimension)

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


12

C'est assez facile à comprendre. Le "-1" signifie "dimension inconnue" qui peut être déduit d'une autre dimension. Dans ce cas, si vous définissez votre matrice comme ceci:

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

Modifiez votre matrice comme ceci:

b = numpy.reshape(a, -1)

Il appellera des opérations sourdes à la matrice a, qui renverra un tableau / martrix numpy 1-d.

Cependant, je ne pense pas que ce soit une bonne idée d'utiliser du code comme celui-ci. Pourquoi ne pas essayer:

b = a.reshape(1,-1)

Cela vous donnera le même résultat et il est plus clair pour les lecteurs de comprendre: Définissez b comme une autre forme de a. Pour a, nous ne savons pas combien de colonnes il devrait avoir (définissez-le sur -1!), Mais nous voulons un tableau à 1 dimension (définissez le premier paramètre sur 1!).


9

Pour faire court : vous définissez certaines dimensions et laissez NumPy définir les autres.

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

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

C'est la réponse en anglais que je cherchais, simple et simple. c'est-à-dire que vous donnez votre préférence de conception, laissez numpy travailler sur les mathématiques restantes :)
Sumanth Lazarus

6

Cela signifie simplement que vous n'êtes pas sûr du nombre de lignes ou de colonnes que vous pouvez donner et que vous demandez à numpy de suggérer le nombre de colonnes ou de lignes à remodeler.

numpy fournit le dernier exemple pour -1 https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

vérifiez le code ci-dessous et sa sortie pour mieux comprendre (-1):

CODE:-

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)

PRODUCTION :-

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

Le résultat final de la conversion est que le nombre d'éléments dans le tableau final est le même que celui du tableau ou de la trame de données initial.

-1 correspond au nombre inconnu de la ligne ou de la colonne. nous pouvons le considérer comme x(inconnu). xest obtenu en divisant le nombre d'éléments du tableau d'origine par l'autre valeur de la paire ordonnée avec -1.

Exemples

12 éléments avec remodeler (-1,1) correspond à un tableau avec x= 12/1 = 12 lignes et 1 colonne.


12 éléments avec remodeler (1, -1) correspond à un tableau avec 1 ligne et x= 12/1 = 12 colonnes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.