Python >> Tutoriel Python >  >> Python

np.reshape() — Le guide ultime en Python

La plupart des noms de fonctions en Python peuvent être intuitivement liés à la signification de la fonction. Le NumPy reshape() fonction ne fait pas exception.

Le reshape() La fonction amène un tableau dans une autre forme tout en conservant toutes les données d'origine. Je vais vous montrer quelques exemples simples dans le guide vidéo suivant :

Pour résumer comment np.reshape() fonctionne :

reshape() de NumPy La fonction prend un tableau à remodeler comme premier argument et le nouveau tuple de forme comme second argument. Il renvoie une nouvelle vue sur les données existantes, si possible, plutôt que de créer une copie complète du tableau d'origine. Le tableau renvoyé se comporte comme un nouvel objet :toute modification apportée à une vue n'affectera aucune autre vue.

Voici quelques exemples minimaux :

>>> import numpy as np
>>> a = np.array([1, 2, 3, 4, 5, 6])
>>> np.reshape(a, (2,3))
array([[1, 2, 3],
       [4, 5, 6]])
>>> np.reshape(a, (3,2))
array([[1, 2],
       [3, 4],
       [5, 6]])
>>> np.reshape(a, (2,3))
array([[1, 2, 3],
       [4, 5, 6]])

Avant de plonger dans plus d'explications sur la forme et les caractéristiques associées, jetons un coup d'œil rapide sur les paramètres et la syntaxe ensuite !

Paramètres et syntaxe

numpy.reshape(a, newshape, order='C')
Paramètre Tapez Description
a array_like Tableau à remodeler.
newshape int ou tuple d'entiers La nouvelle forme et la forme d'origine doivent être compatibles.

Si la nouvelle forme est un entier i , le tableau remodelé sera un tableau 1-D de longueur i .

Si la nouvelle forme est un tuple, chaque élément de tuple spécifie la forme d'une dimension. Une dimension de forme peut être -1 auquel cas la valeur est déduite de la longueur du tableau et des dimensions restantes.
order {'C', 'F', 'A'} , facultatif, par défaut 'C' Si spécifié, lit et place les éléments de a en utilisant cet ordre d'index.

'C' :lire ou écrire des éléments de sorte que le dernier index d'axe change le plus rapidement, de retour au premier index d'axe changeant le plus lentement.
'F' :lire ou écrire les éléments de sorte que le premier index change le plus rapidement et le dernier index change le plus lentement.
– 'A' :lire ou écrire les éléments en 'F' commander si un est Fortran contigu en mémoire, et en 'C' commandez autrement.

Valeur de retour :La sortie du np.reshape() la fonction est le ndarray remodelé comme un nouvel objet si possible.

La propriété Shape d'un tableau NumPy

Avant de se concentrer sur le reshape() fonction , nous avons besoin de pour comprendre quelques concepts de base de NumPy.

Supposons que nous ayons un données volumineuses définir et compter le nombre d'entrées serait une tâche impossible. Nous pourrions utiliser le shape attribut pour trouver le nombre d'éléments le long de chaque dimension de ce tableau.

🛑 Attention :Attention à ne pas oublier que shape est un attribut et non une fonction. Les attributs ne sont pas suivis de parenthèses.

Le shape renvoie toujours un tuple qui nous indique la longueur de chaque dimension.

Le tableau unidimensionnel (1D) est un vecteur ligne et sa forme est une valeur unique itérable suivie d'une virgule. Les tableaux unidimensionnels n'ont pas de lignes ni de colonnes, donc l'attribut shape renvoie un tuple à valeur unique.

Prenons un exemple :

import numpy as np

# 1D NumPy array
arr = np.arange(10)

print(arr)
# [0 1 2 3 4 5 6 7 8 9]

print(arr.shape)
# (10, )

L'extrait de code utilise également le NumPy arange() fonction pour créer un tableau initial de valeurs suivantes entre 0 et 9.

💡 Référence :Veuillez trouver une discussion détaillée de NumPy arange fonction dans cet article de blog Finxter.

Le shape attribut d'un tableau à deux dimensions (2D), également appelé matrice , nous donne un tuple. Le shape L'attribut renvoie le nombre d'éléments le long de chaque dimension, qui est le nombre de lignes et de colonnes dans le tableau à deux dimensions.

# A two-dimensional NumPy array
import numpy as np

arr = np.array([[1,2,3,4,5], [5,4,3,2,1]])
print(arr.shape)
# (2, 5)

L'exemple suivant concerne la forme de tableaux tridimensionnels (3D).

# A three-dimensional array
import numpy as np

arr = np.array([[[0, 11, 15, 16], 
                 [3, 7, 10, 34], 
                 [44, 99, 5, 67]],
                [[52, 8, 11, 13], 
                 [0, 4, 5, 6], 
                 [4, 4, 4, 4]]])
print(arr.shape)
# (2, 3, 4)

Il faut un peu de pratique pour comprendre le shape tuple pour les tableaux multidimensionnels.

Les dimensions représentées par un tuple sont lues de l'extérieur vers l'intérieur.

Si vous observez les crochets, le crochet le plus à l'extérieur fait partie de la syntaxe de base pour l'ensemble du tableau. Dans la forme tuple 2 représente le deuxième ensemble de crochets. Si vous les comptez, vous verrez qu'il y a 2 éléments dans cette dimension.

1er élément [[0, 11, 15, 16], [3, 7, 10, 34], [44, 99, 5, 67]]

2ème élément [[52, 8, 11, 13], [0, 4, 5, 6], [4, 4, 4, 4]]

Chaque élément contient trois autres éléments dans la deuxième dimension. Si vous pensez aux listes imbriquées, vous pouvez faire l'analogie.

Ces éléments sont :

1er élément [0, 11, 15, 16]

2ème élément [3, 7, 10, 34]

3ème élément [44, 99, 5, 67]

Enfin, le numéro 4 représente le nombre d'éléments dans la troisième dimension. Ce sont les éléments les plus intimes. Par exemple 0, 11, 15 et 16.

Qu'est-ce que la fonction reshape() dans NumPy ?

Comment relions-nous le shape de NumPy attribut au NumPy reshape() fonction ?

Syntaxe

numpy.reshape(arr, newshape, order)

  • arr est le tableau que nous souhaitons remodeler,
  • newshape est un entier pour les tableaux unidimensionnels et un tuple d'entiers multidimensionnels, et
  • order est un argument facultatif que nous n'aborderons pas dans ce guide.

Remodeler un tableau peut être utile lors du nettoyage des données, ou s'il y a des calculs élémentaires simples qui doivent être effectués.

L'un des avantages du tableau NumPy par rapport à la liste Python est la possibilité d'effectuer plus facilement des opérations vectorisées. De plus, le remodelage des tableaux est courant dans l'apprentissage automatique.

Gardez à l'esprit que tous les éléments du tableau NumPy doivent être du même type.

Remodeler le tableau NumPy 1D en 2D

Colonnes multiples

Disons que nous mesurions la température extérieure 3 jours de suite, à la fois en Celsius et en Fahrenheit.

Nous avons enregistré notre mesure sous la forme d'un vecteur unidimensionnel (1D) où tous les indices pairs représentent la température écrite en degrés Celsius et tous les indices impairs représentent la température écrite en degrés Fahrenheit.

temp = [10, 50, 15, 59, 5, 42]

Il y a 6 éléments enregistrés sur une seule ligne.

Pour remodeler le temp unidimensionnel array à un tableau à deux dimensions, nous devons passer un tuple avec un certain nombre de lignes et de colonnes au reshape fonction.

Plus précisément, ce tuple sera composé de deux nombres, appelons-les m et n , où le premier nombre est le nombre de lignes et le deuxième nombre est le nombre de colonnes.

💡 Remarque :m*n , le nombre de lignes multipliées par le nombre de colonnes, doit être le même que le nombre d'éléments dans le tableau d'origine. Dans cet exemple, le nombre d'éléments dans le tableau d'origine est 6*1=6.

Ainsi, nous n'avons que deux options pour le tableau à deux dimensions, 2 lignes et 3 colonnes ou 3 colonnes et 2 lignes.

import numpy as np

temp = [10, 50, 15, 59, 5, 42]

temp = np.reshape(temp, (3,2))
print(temp)

"""
[[10 50]
 [15 59]
 [ 5 42]]
"""

Les données n'ont pas changé; les mêmes éléments sont dans le même ordre. Ils sont réorganisés en deux lignes et trois colonnes.

Une colonne

Dans la section sur le shape , nous avons dit que la forme d'un tableau à une dimension est donnée par un tuple qui contient un entier suivi d'une virgule. Ensuite, nous avons expliqué que ce vecteur ne contient ni lignes ni colonnes.

Et si nous voulons que ce vecteur ait une colonne et autant de lignes qu'il y a d'éléments ?

Nous pouvons le faire en utilisant reshape() . Même s'il n'y a qu'une seule colonne, ce tableau aura deux dimensions.

import numpy as np

arr = np.arange(10)
print(arr.shape)
# (10, )

#reshaping this vector
arr = np.reshape(arr, (arr.shape[0], 1))
print(arr.shape)
# (10, 1)

Remodeler le tableau NumPy 2D en 1D

Disons que nous recueillons des données à partir d'une compétition universitaire d'athlétisme en salle pour le 200 mètres féminin.

  • Lors de la première rencontre, nous enregistrons trois meilleurs temps 23,09 secondes, 23,41 secondes, 24,01 secondes.
  • Au cours de la deuxième compétition, nous avons enregistré trois meilleurs temps en 22,55 secondes, 23,05 secondes et 23,09 secondes.

Nous enregistrons cela dans un tableau à deux dimensions. Mais une fois que nous commençons à analyser les données, nous avons besoin que les résultats soient sur une seule ligne. Nous procédons comme suit pour remodeler la matrice :

import numpy as np

track = np.array([[23.09, 23.41, 24.01], [22.55, 23.05, 23.09]])
track = np.reshape(track, (6,))

print(track)
# [23.09 23.41 24.01 22.55 23.05 23.09]

print(track.shape)
# (6,)

print(track.ndim)
# 1

Remodeler NumPy(arr, -1)

Maintenant, nous sommes plus susceptibles d'avoir une situation où nous avons des milliers de entrées dans nos données.

Disons que nous avons collecté des données du la piste intérieure du collège se réunit pour le sprint de 200 mètres pour les femmes sur le 3 dernières années.

Il était facile de compter le nombre d'entrées lorsque nous n'avaient que six, mais maintenant nous avons des milliers d'entrées. Au lieu de faire la lourde tâche de compter le nombre d'entrées, nous pouvons passer -1 dans le newshape arguments.

Nous pouvons le montrer dans l'exemple suivant :

import numpy as np

track = np.array([[23.09, 23.41, 24.01], [22.55, 23.05, 23.09]])
track = np.reshape(track, -1)

print(track)
# [23.09 23.41 24.01 22.55 23.05 23.09]

print(track.shape)
# (6,)

print(track.ndim)
# 1

Utilisation de -1 pour newshape peut être utile dans les tableaux multidimensionnels. Nous y reviendrons dans la section suivante.

Remodeler le tableau NumPy 3D en 2D

Parfois, les données que nous collectons seront désordonnées et avant de commencer à les analyser, nous devons les ranger.

Disons que nous avons un tableau NumPy tridimensionnel qui ressemble à ceci :

data = [[[ 0, 1],
         [ 2, 3]],
        [[ 4, 5],
         [ 6, 7]],
        [[ 8, 9],
         [10, 11]],
        [[12, 13],
         [14, 15]]]

Lorsque nous examinons les données de plus près, nous pouvons voir qu'il serait plus logique de les stocker sous forme de matrice à deux dimensions.

Nous pouvons compter le nombre de "paires" que nous voulons avoir. Une façon de procéder est :

data = np.array(data)
data = np.reshape(data, (8,2))
print(data)
"""
[[ 0  1]
 [ 2  3]
 [ 4  5]
 [ 6  7]
 [ 8  9]
 [10 11]
 [12 13]
 [14 15]]
"""

NumPy reshape(-1, m) et reshape(n, -1)

La méthode ci-dessus de remodelage d'un tableau tridimensionnel (3D) en un tableau bidimensionnel (2D) fonctionne si nous n'avons pas un grand nombre d'entrées.

Cependant, si nous avons des milliers d'entrées, cela peut être délicat. Dans ce cas, nous pouvons utiliser -1 pour une dimension et si possible les données seront remodelées pour nous.

En utilisant l'exemple ci-dessus :

import numpy as np

data = [[[ 0, 1],
 [ 2, 3]],
 [[ 4, 5],
 [ 6, 7]],
 [[ 8, 9],
 [10, 11]],
 [[12, 13],
 [14, 15]]]

data = np.array(data)
data = np.reshape(data, (-1,2))
print(data)
"""
[[ 0  1]
 [ 2  3]
 [ 4  5]
 [ 6  7]
 [ 8  9]
 [10 11]
 [12 13]
 [14 15]]
"""

np.reshape contre np.newaxis

Lorsque nous voulons effectuer des opérations sur des tableaux, ils doivent être compatibles.

Au niveau des éléments, la taille des tableaux doit être égale dans une dimension. Mais, ils ne doivent pas nécessairement avoir le même nombre de dimensions. Si les tailles ne sont pas égales, NumPy génère une erreur.

Lorsque les tableaux sont de dimensions différentes, une façon d'ajouter une dimension consiste à utiliser le reshape() fonction.

Une autre façon consiste à utiliser np.newaxis expression .

L'avantage de np.newaxis sur reshape() est que vous n'avez pas besoin de connaître le nombre de dimensions à ajouter. Le np.newaxis expression augmente la dimension de sorte que les tableaux unidimensionnels deviennent les tableaux bidimensionnels et bidimensionnels deviennent tridimensionnel, et ainsi de suite…

La façon dont cela fonctionne, il "découpe" un tableau en ajoutant une dimension. Si nous regardons le tableau de température d'origine plus tôt dans le guide :

import numpy as np

temp = np.array([10, 50, 15, 59, 5, 42])

print(temp.shape)
# (6,)

temp = temp[np.newaxis, :]
print(temp.shape)
# (6,1)

print(temp)
# [[10 50 15 59  5 42]]

Attribution

Cet article est une contribution de l'utilisateur Finxter Milica Cvetkovic. Milica est également rédactrice sur Medium – consultez son profil Medium.