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?
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
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/
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.
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]])
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!).
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 + ...))