Python >> Tutoriel Python >  >> Python

Comment utiliser np.linspace() en Python ? Un guide illustré utile

Dans cet article, je vais vous expliquer le np.linspace fonction, comment l'utiliser et quand vous devriez. Il a un peu la réputation d'être compliqué mais, comme vous le verrez, ce n'est vraiment pas le cas ! Alors, commençons par un bref aperçu.

Syntaxe : numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)

Argument Par défaut Description
start -- La valeur de départ de la séquence.
stop -- La valeur finale de la séquence.
num 50 Le numéro nombre d'échantillons à générer. Doit être non négatif (vous ne pouvez pas générer un nombre d'échantillons inférieur à zéro !).
endpoint True Si True , le point de terminaison est inclus dans l'échantillon, si False ce n'est pas le cas.
retstep False S'il faut retourner une étape valeur dans le calcul. Le pas est la distance entre chaque valeur.
Si True , renvoie (samples, step) sous la forme d'un tuple.
dtype None Le dtype de tous les éléments du tableau de sortie (les tableaux NumPy ne contiennent que des éléments d'un seul type).
Si dtype=str , toutes les valeurs seront des chaînes, de même si dtype=int , toutes les valeurs seront des nombres entiers.
axis 0 Si start ou stop est comme un tableau, vous pouvez définir le axis le long de laquelle vous stockerez les échantillons.

Valeur de retour : Par défaut, la fonction renvoie un tableau NumPy d'échantillons uniformément répartis entre start et stop . Mais si vous définissez retstep = True , il renverra également le step valeur.

Retour Description
échantillons Tableau NumPy d'échantillons dans l'intervalle [start, stop] .
étape Valeur numérique donnant l'espace entre deux échantillons (uniquement si retstep==True ).

Examinons d'abord plus en détail les trois arguments les plus courants :start , stop et num .
Voici ce que la documentation officielle de NumPy a à dire :

numpy.linspace(start, stop, num=50)

Renvoyer des nombres régulièrement espacés sur un intervalle spécifié. Renvoie nombre d'échantillons régulièrement espacés. Le point de terminaison de l'intervalle peut éventuellement être exclu.

Remarque :comme son nom l'indique, np.linspace renvoie des nombres qui sont espacés linéairement une part. Ainsi, ils sont tous à la même distance les uns des autres (pensez aux points sur une ligne).

De la définition, il s'ensuit que np.linspace(-3, 3) nous donnera 50 nombres régulièrement espacés dans l'intervalle [-3, 3] .
Vérifions cela avec du code.

Essayez vous-même  :Vous pouvez exécuter le code dans le shell en cliquant sur "Exécuter" !

Exercice :Pouvez-vous réduire le nombre d'échantillons à 10 ?

>>> A = np.linspace(-3, 3)

>>> type(A)
numpy.ndarray

# Number of elements in A
>>> len(A)
50

# First element of A
>>> A[0]
-3.0

# Last element of A
>>> A[-1]
3.0

# The difference between every value is the same: 0.12244898
>>> np.diff(A)
array([0.12244898, 0.12244898, 0.12244898, 0.12244898, 0.12244898,
       0.12244898, 0.12244898, 0.12244898, 0.12244898, 0.12244898,
       0.12244898, 0.12244898, 0.12244898, 0.12244898, 0.12244898,
       0.12244898, 0.12244898, 0.12244898, 0.12244898, 0.12244898,
       0.12244898, 0.12244898, 0.12244898, 0.12244898, 0.12244898,
       0.12244898, 0.12244898, 0.12244898, 0.12244898, 0.12244898,
       0.12244898, 0.12244898, 0.12244898, 0.12244898, 0.12244898,
       0.12244898, 0.12244898, 0.12244898, 0.12244898, 0.12244898,
       0.12244898, 0.12244898, 0.12244898, 0.12244898, 0.12244898,
       0.12244898, 0.12244898, 0.12244898, 0.12244898])

Si nous ne voulons que 10 échantillons entre -3 et 3, nous définissons num=10 .

>>> B = np.linspace(-3, 3, num=10)

# B only contains 10 elements now
>>> len(B)
10

exemple np.linspace

Définissons une fonction simple :

def f(x):
    return x*(x-2)*(x+2)

Si vous vous souvenez de vos maths du secondaire, vous saurez qu'il s'agit d'une cubique positive qui coupe l'axe des x à 0, 2 et -2. Ainsi, la zone d'intérêt est sur l'axe des abscisses à partir de (-3, 3).

Maintenant, nous le traçons en utilisant le même np.linspace() comme ci-dessus (renommé pour plus de lisibilité).

x_values = np.linspace(-3, 3)

plt.plot(x_values, f(x_values))

# Add labels
plt.title('Line Plot of f(x) Using np.linspace')
plt.xlabel('x')
plt.ylabel('f(x)')

plt.show()

Remarque :Parce que np.linspace renvoie un tableau NumPy, nous pouvons leur appliquer des fonctions entières élément par élément. Cela les rend super faciles à utiliser.

Remarque 2  :J'ai laissé de côté le code en ajoutant des titres et des étiquettes d'axe à partir de maintenant pour économiser de l'espace.

Pour voir ce qui se passe à un niveau plus profond, faisons un nuage de points des mêmes données.

plt.scatter(x_values, f(x_values))
plt.show()

Voyons maintenant ce qui se passe si vous n'utilisez pas np.linspace().

np.linspace contre np.arange

Vous avez peut-être rencontré une fonction similaire à np.linspace , à savoir np.arange . Comme son nom l'indique, il renvoie une plage de valeurs entre les valeurs de départ et d'arrêt données.

Voyons ce qui se passe si nous remplaçons np.linspace avec np.arange dans notre code ci-dessus :

x_values = np.arange(-3, 3)

plt.plot(x_values, f(x_values))
plt.show()

Ce qui s'est passé? Dessinons un nuage de points et voyons ce qui se passe plus en détail.

En regardant cela et ce que np.arange() revient, nous voyons le problème.

>>> np.arange(-3, 3)
array([-3, -2, -1,  0,  1,  2]) 

Nous n'obtenons que six valeurs x, espacées d'un entier et nous n'obtenons même pas 3 inclus à la fin ! Étant donné que nous avons besoin d'un grand nombre de valeurs x pour que notre tracé linéaire soit fluide, ce n'est pas suffisant.

Ne pouvons-nous pas résoudre ce problème en définissant le pas sur autre chose que 1, disons sur 0,1 ? Nous pouvons mais les documents NumPy déconseillent explicitement de le faire car cela conduit à des incohérences entre les résultats. Les raisons à cela sortent du cadre de cet article. Il est recommandé d'utiliser np.linspace et votre moi plus âgé vous remerciera si vous construisez de bonnes habitudes maintenant.

np.linspace 2D

Vous voudrez peut-être tracer une fonction de plus d'une variable telle que

def g(x, y):
    return (x - y)**3 * (3*x**2 + y)

Dans ce cas, vous n'avez pas seulement besoin de np.linspace mais aussi np.meshgrid . Petite explication :si votre fonction est de dimension N, np.meshgrid prendra N np.linspace fonctionne comme entrée.

Tous les arguments expliqués

Voici tous les arguments possibles et leurs valeurs par défaut pour np.linspace :

np.linspace(start, stop, num=50, endpoint=True, restep=False, dtype=0, axis=0)

démarrer, arrêter - comme un tableau

La valeur de début et de fin de la séquence respectivement. Vous pouvez passer des listes ou des tableaux pour obtenir de nombreux espaces linéaires dans un tableau. Ceux-ci sont accessibles via le découpage NumPy normal.

# Linear spaces [1-4], [2-4] and [3-4] in one array
>>> np.linspace([1, 2, 3], 4, num=5)
array([[1.  , 2.  , 3.  ],
       [1.75, 2.5 , 3.25],
       [2.5 , 3.  , 3.5 ],
       [3.25, 3.5 , 3.75],
       [4.  , 4.  , 4.  ]])

# Linear spaces [1-4], [2-5] and [3-6] in one array
>>> np.linspace([1, 2, 3], [4, 5, 6], num=5)
array([[1.  , 2.  , 3.  ],
       [1.75, 2.75, 3.75],
       [2.5 , 3.5 , 4.5 ],
       [3.25, 4.25, 5.25],
       [4.  , 5.  , 6.  ]])

num – entier, 50 par défaut

Le num nombre d'échantillons à générer. Doit être non négatif (vous ne pouvez pas générer un nombre d'échantillons inférieur à zéro !).

endpoint – bool, Vrai par défaut

Si True , le point de terminaison est inclus dans l'échantillon, si False ce n'est pas le cas.

retstep – bool, faux par défaut

S'il faut retourner d'une étape valeur dans le calcul. Le pas est la distance entre chaque valeur.
Si True , np.linspace renvoie (samples, step) sous la forme d'un tuple.

>>> sample, step = np.linspace(1, 2, num=5, retstep=True)

>>> sample
array([1.  , 1.25, 1.5 , 1.75, 2.  ])

>>> step
0.25

dtype – dtype, par défaut Aucun

Le dtype de tous les éléments du tableau de sortie (rappelez-vous que les tableaux NumPy ne contiennent que des éléments d'un seul type !).

Si dtype=str , toutes les valeurs seront des chaînes, de même si dtype=int , toutes les valeurs seront des nombres entiers.

Pour être honnête, je ne vois pas beaucoup de cas où vous voudriez utiliser cette fonctionnalité. Habituellement, vous utiliserez np.linspace pour créer un tableau de flottants entre deux nombres. Si vous voulez créer un tableau d'entiers, np.arange est bien mieux. Tout d'abord, son paramètre par défaut est de renvoyer un tableau d'entiers. Deuxièmement, il agit comme le python intégré range() fonction que vous connaissez et aimez déjà ! Mais si vous en trouvez des cas d'utilisation, faites-le moi savoir dans les commentaires !

axe - entier, 0 par défaut

Si start ou stop est comme un tableau, nous pouvons définir l'axe long duquel nous stockerons les échantillons.

# Store the 50 samples on the rows (default behaviour)
>>> np.linspace([1, 2, 3], 4, axis=0).shape 
(50, 3)


# Store the 50 samples along the columns
>>> np.linspace([1, 2, 3], 4, axis=1).shape 
(3, 50)

Et c'est tout pour le np.linspace fonction! Vous savez maintenant presque tout ce qu'il y a à savoir ! Ce n'était pas si mal après tout, n'est-ce pas ?

Si vous avez des questions, posez-les dans les commentaires et je vous répondrai dès que possible !

Fonctions similaires

Si vous avez aimé cela et que vous vous demandez si NumPy a des fonctions différentes mais similaires, la réponse est oui ! Voici quelques exemples à vérifier :

  • np.geomspace - les nombres sont espacés uniformément sur une échelle logarithmique (progression géométrique)
  • np.logspace - similaire à geomspace mais les points de terminaison sont spécifiés sous forme de logarithmes

Attribution

Cet article est une contribution de l'utilisateur Finxter Adam Murphy (scientifique des données):

Je suis un programmeur autodidacte avec un diplôme de première classe en mathématiques de l'Université de Durham et je code depuis juin 2019.

Je connais bien les principes de base du web scraping et de la science des données et je peux vous fournir très rapidement une grande variété d'informations sur le Web.

J'ai récemment récupéré des informations sur toutes les montres que Breitling et Rolex vendent en seulement 48 heures et je suis convaincu que je peux vous fournir des ensembles de données de qualité similaire, quels que soient vos besoins.

Étant de langue maternelle anglaise, mes compétences en communication sont excellentes et je suis disponible pour répondre à toutes vos questions et fournirai des mises à jour régulières sur l'avancement de mon travail.

Si vous souhaitez embaucher Adam, consultez son profil Upwork !