web-dev-qa-db-fra.com

Qu'est-ce que -1 signifie en numpy remodeler?

Une matrice numpy peut être transformée en un vecteur en utilisant la fonction reshape 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 de b est: 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 sens, tels que: array[-1] signifie le dernier élément. Pouvez-vous donner une explication?

322
user2262504

Le critère à satisfaire pour fournir la nouvelle forme est le suivant: "La nouvelle forme doit être compatible avec la forme d'origine" .

numpy nous permet de donner un des nouveaux paramètres de forme sous la forme -1 (par exemple: (2, -1) ou (-1,3) mais pas (-1, -1)). Cela signifie simplement que c'est une dimension inconnue et que nous voulons que Numpy le découvre. Et numpy va comprendre cela en regardant la 'longueur du tableau et les dimensions restantes' et en s'assurant qu'il répond aux critères susmentionnés

Maintenant, voir l'exemple.

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

Maintenant, essayez de remodeler avec (-1). Résultat 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])

Maintenant, essayez de remodeler avec (-1, 1). Nous avons fourni la colonne sous la forme 1 mais les lignes comme inconnues. On obtient donc une nouvelle forme comme (12, 1). Encore compatible avec la forme originale (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 le message de conseil/d'erreur numpy à utiliser reshape(-1,1) pour une fonction unique; c'est-à-dire une colonne

Remodelez vos données avec array.reshape(-1, 1) si vos données ont un fonctionnalité unique

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

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

Nous essayons maintenant de garder la colonne inconnue. Nouvelle forme comme (1, -1). c'est-à-dire que la ligne est 1, la colonne inconnue. nous obtenons résultat nouvelle forme 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 cohérent avec le message de conseil/d'erreur numpy à utiliser reshape(1,-1) pour un seul échantillon; c'est-à-dire une rangée

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

Nouvelle forme (2, -1). Rangée 2, colonne inconnue. nous obtenons 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). Rangée 3, colonne inconnue. nous obtenons 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 sous une forme inconnue, c'est-à-dire une nouvelle forme sous la forme (-1, -1). Il va jeter une erreur

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

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 à 5 X 5 x 8:

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

va faire le travail.

Notez que, une fois que vous avez réglé le premier dim = 5 et le second dim = 5, vous n'avez pas besoin de déterminer la troisième dimension. Pour aider votre paresse, python donne l'option de -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 lire plus à http://anie.me/numpy-reshape-transpose-theano-dimshuffle/

70
Anuj Gupta

Selon the documentation :

newshape: int ou Tuple of ints

La nouvelle forme doit être compatible avec la forme d'origine. S'il s'agit d'un entier, le résultat sera un tableau à une dimension 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.

57
falsetru

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 que le nombre de lignes est 1.

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

sortie:

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

ceci 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 rangées à 1 dimension)

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

14
Dinesh Kumar

C'est assez facile à comprendre. "-1" signifie "dimension inconnue" qui peut être déduite 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 certaines opérations de défense à la matrice a, qui renverra un tableau numpy/martrix 1d.

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

b = a.reshape(1,-1)

Cela vous donnera le même résultat et il sera 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 souhaitons un tableau à 1 dimension (définissez le premier paramètre sur 1!).

12
F0rge1cE

Long histoire courte: vous définissez certaines dimensions et laissez NumPy définir le (s) reste (s).

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

(userDim1, userDim1, ..., TOTAL_DIMENSION - (userDim1 + userDim2 + ...))
8
Shayan Amani