Sådan opretter du arrays med jævnt fordelte tal

Denne tutorial vil lære dig, hvordan du bruger NumPy linspace() til at skabe en række ligeligt fordelte tal i Python.

Du lærer syntaksen for NumPy linspace(), efterfulgt af eksempler, der hjælper dig med at forstå, hvordan du bruger det.

Bemærk: For at følge med i denne tutorial skal du have Python og NumPy installeret.

Har du ikke NumPy endnu? Vi har sammensat en hurtig installationsvejledning til dig.

Lad os begynde!

Installer og importer NumPy

Før du starter selvstudiet, lad os hurtigt gennemgå trinene for at installere NumPy-biblioteket.

⏩ Hvis du allerede har NumPy installeret, er du velkommen til at springe til næste afsnit.

  • Hvis du bruger Google Colab – et skybaseret Jupyter notebookmiljø, kan du importere NumPy og begynde at kode med det samme. (anbefales til denne tutorial ✅)
  • Hvis du gerne vil opsætte et lokalt arbejdsmiljø, anbefaler jeg at installere Anaconda-distributionen af ​​Python. Anaconda kommer med flere nyttige pakker forudinstalleret. Du kan downloade installationsprogrammet til dit operativsystem. Opsætningsprocessen tager kun et par minutter.⌛
  • Hvis du allerede har Python installeret på din computer, kan du stadig installere Anaconda-distributionen. Du kan bruge conda eller pip til at installere og administrere pakker. Du kan køre en af ​​følgende kommandoer fra Anaconda-kommandoprompten for at installere NumPy.
# Install NumPy using conda
conda install numpy

# Install NumPy using pip
pip install numpy

Som et næste trin skal du importere numpy under aliaset np ved at køre følgende kommando. Ved at gøre dette vil du hjælpe dig med at referere til NumPy som np – uden at skulle skrive numpy ned hver gang du får adgang til et element i modulet.

import numpy as np

Fremover vil vi bruge punktnotationen til at få adgang til alle funktioner i NumPy-biblioteket som denne: np..

Sagen for jævnt fordelte tal

Når du arbejder med NumPy-arrays, er der tidspunkter, hvor du bliver nødt til at oprette en matrix af ligeligt fordelte tal i et interval.

Før vi går videre, lad os hurtigt gennemgå en anden lignende funktion np.arange().

NumPy linspace() vs. NumPy arange()

Hvis du har brugt NumPy før, ville du sandsynligvis have brugt np.arange() til at skabe en matrix af tal inden for et specificeret interval.

  Sådan kopieres og indsættes på Mac

Du ved, at np.arange(start, stop, step) returnerer et array af tal fra start op til, men ikke inklusive stop, i trin af trin; standardtrinstørrelsen er 1.

Værdien af ​​trin er dog ikke altid indlysende. Lad os se, hvorfor det er tilfældet.

Hvis du for eksempel har brug for 4 lige store tal mellem 0 og 1, ved du, at trinstørrelsen skal være 0,25. Men hvis du bruger np.arange(), inkluderer det ikke stopværdien 1. Så du bliver nødt til at vælge et interval, der går ud over stopværdien.

Følgende billede illustrerer et par flere eksempler, hvor du har brug for et bestemt antal jævnt fordelte punkter i intervallet [a, b].

Jævnt fordelte punkter i et interval

Vores første eksempel på 4 jævnt fordelte punkter ind [0,1] var let nok. Du ved, at trinstørrelsen mellem punkterne skal være 0,25.

Antag, at du har et lidt mere involveret eksempel – hvor du skulle angive 7 jævnt fordelte punkter mellem 1 og 33. Her er trinstørrelsen måske ikke særlig klar med det samme. Du kan dog manuelt beregne værdien af ​​trin i dette tilfælde.

Men np.linspace() er her for at gøre det endnu nemmere for dig! 😄

Brug NumPy linspace

Når du bruger np.linspace(), behøver du kun at angive antallet af punkter i intervallet – uden at bekymre dig om trinstørrelsen. Og du får arrayet tilbage som ønsket.

Med denne motivation, lad os fortsætte med at lære syntaksen for NumPy linspace() i næste afsnit.

Syntaks for NumPy linspace()

Syntaksen for at bruge NumPy linspace() er vist nedenfor:

np.linspace(start, stop, num, endpoint, retstep, dtype, axis)

I starten kan ovenstående syntaks virke meget kompliceret med mange parametre.

De fleste af dem er dog valgfrie parametre, og vi når frem til en meget enklere syntaks på blot et par minutter.

Lad os nu starte med at analysere ovenstående syntaks:

  • start og stop er henholdsvis start- og slutpunkter for intervallet. Både start og stop kan være skalarer eller arrays. Vi begrænser os til skalære start- og slutværdier i denne øvelse.
  • num er antallet af jævnt fordelte punkter. Og det er en valgfri parameter med en standardværdi på 50.
  • endepunkt er også en valgfri parameter, der kan være enten Sand eller Falsk.
  • Standardværdien er True, hvilket betyder, at slutpunktet som standard inkluderes i intervallet. Du kan dog indstille den til Falsk for at udelukke slutpunktet.
  • retstep er endnu en valgfri parameter, der tager Booleans True eller False. Når den er indstillet til True, returneres trinværdien.
  • dtype er datatypen for tallene i arrayet. Typen udledes sædvanligvis som float og skal ikke angives eksplicit.
  • akse er en anden valgfri parameter, der angiver den akse, langs hvilken tallene skal lagres. Og dette er kun relevant, når start- og stopværdierne selv er arrays.
  Sådan fortæller du, om din iPhone har en virus

▶️ Så hvad returnerer np.linspace()?

Det returnerer en N-dimensional matrix af ligeligt fordelte tal. Og hvis parameteren retstep er sat til True, returnerer den også trinstørrelsen.

Baseret på diskussionen indtil videre er her en forenklet syntaks til at bruge np.linspace():

np.linspace(start, stop, num)

Ovenstående kodelinje vil returnere en matrix af antal ligeligt fordelte tal i intervallet [start, stop].

Nu hvor du kender syntaksen, lad os begynde at kode eksempler.

Sådan opretter du jævnt fordelte arrays med NumPy linspace()

#1. Som vores første eksempel, lad os skabe en matrix med 20 jævnt fordelte tal i intervallet [1, 5].

Du kan angive værdierne start, stop og num som nøgleordsargumenter. Dette er vist i kodecellen nedenfor:

import numpy as np
arr1 = np.linspace(start = 1,stop = 5,num = 20)
print(arr1)

# Output:
[1.         1.21052632 1.42105263 1.63157895 1.84210526 2.05263158
 2.26315789 2.47368421 2.68421053 2.89473684 3.10526316 3.31578947
 3.52631579 3.73684211 3.94736842 4.15789474 4.36842105 4.57894737
 4.78947368 5.        ]

Læg mærke til, hvordan tallene i arrayet starter ved 1 og slutter ved 5 – inklusive begge slutpunkter. Bemærk også, hvordan tallene, inklusive punkterne 1 og 5, er repræsenteret som flydende i det returnerede array.

#2. I det forrige eksempel havde du indtastet værdierne for start, stop og num som nøgleordsargumenter. Hvis du sender argumenterne i den rigtige rækkefølge, kan du lige så godt bruge dem som positionelle argumenter med kun værdierne, som vist nedenfor.

import numpy as np
arr2 = np.linspace(1,5,20)
print(arr2)

# Output:
[1.         1.21052632 1.42105263 1.63157895 1.84210526 2.05263158
 2.26315789 2.47368421 2.68421053 2.89473684 3.10526316 3.31578947
 3.52631579 3.73684211 3.94736842 4.15789474 4.36842105 4.57894737
 4.78947368 5.        ]

#3. Lad os nu oprette et andet array, hvor vi sætter retstep til True.

Det betyder, at funktionen nu vil returnere både arrayet og trinnet. Og vi kan pakke dem ud i to variabler arr3: arrayet og step_size: den returnerede trinstørrelse.

Den følgende kodecelle forklarer, hvordan du kan gøre det.

import numpy as np
arr3, step_size = np.linspace(1,5,20,retstep = True)
print(arr3)

# Output:
[1.         1.21052632 1.42105263 1.63157895 1.84210526 2.05263158
 2.26315789 2.47368421 2.68421053 2.89473684 3.10526316 3.31578947
 3.52631579 3.73684211 3.94736842 4.15789474 4.36842105 4.57894737
 4.78947368 5.        ]

# Output:
print(step_size)
0.21052631578947367

#4. Som et sidste eksempel, lad os sætte slutpunktet til Falsk og kontrollere, hvad der sker.

import numpy as np
arr4 = np.linspace(1,5,20,endpoint = False)
print(arr4)

# Output:
[1.  1.2 1.4 1.6 1.8 2.  2.2 2.4 2.6 2.8 3.  3.2 3.4 3.6 3.8 
4.  4.2 4.4 4.6 4.8]

I det returnerede array kan du se, at 1 er inkluderet, hvorimod 5 ikke er inkluderet. Og den sidste værdi i arrayet er tilfældigvis 4,8, men vi har stadig 20 tal.

  Mestrer hurtigt hastighedslæsning med Readsy Web App

Indtil videre har vi kun genereret arrays af ligeligt fordelte tal. Lad os i næste afsnit visualisere ved at plotte disse tal.

Sådan plottes tal med jævnt mellemrum i et interval

Lad os i dette afsnit vælge [10,15] som interesseintervallet. Og brug derefter np.linspace() til at generere to arrays, hver med henholdsvis 8 og 12 point.

Når dette er fuldført, kan vi bruge plottefunktionen fra matplotlib-biblioteket til at plotte dem.

For klarhedens skyld klemmer vi de to arrays af N1 = 8 og N2 = 12 jævnt fordelte punkter på forskellige positioner langs y-aksen.

Det følgende kodestykke demonstrerer dette.

import numpy as np
import matplotlib.pyplot as plt

N1 = 8
N2 = 12

a = 10
b = 15

y1 = np.zeros(N1)
y2 = np.zeros(N2)

x1 = np.linspace(a, b, N1)
x2 = np.linspace(a, b, N2)

plt.plot(x1, y1-0.5, 'o')
plt.plot(x2, y2 + 0.5, 'o')

plt.ylim([-1, 1])

plt.title(f'Evenly Spaced Numbers in the Interval [{a},{b}]')
plt.xlabel('Interval')

plt.show()

Generering af jævnt fordelte punkter kan være nyttigt, når du arbejder med matematiske funktioner. Det lærer vi om i næste afsnit.

Sådan bruges NumPy linspace() med matematiske funktioner

Efter at du har genereret en matrix af jævnt fordelte tal ved hjælp af np.linspace(), kan du beregne værdierne af matematiske funktioner i intervallet.

I kodecellen nedenfor genererer du først 50 jævnt fordelte punkter i intervallet 0 til 2π. Og opret derefter arrayet y ved hjælp af np.sin() på arrayet x. Bemærk, at du kan springe parameteren num over, da standardværdien er 50. Vi vil stadig bruge den eksplicit.

Som næste trin kan du plotte sinusfunktionen i intervallet [0, 2π]. For at gøre dette kan du bruge matplotlib, som i det foregående eksempel. Specifikt bruges plot()-funktionen i matplotlib.pytplot til at oprette et linjeplot.

import numpy as np
import matplotlib.pyplot as plt

N = 50

a = 0.0
b = 2*np.pi

x = np.linspace(a, b, N)
y = np.sin(x)

plt.plot(x, y, marker = "o")

plt.ylim([-1, 1])
plt.title(f'y = sin(x)')
plt.xlabel('x ---->')

plt.show()

Kør nu ovenstående kode ved at sætte N lig med 10. Du får plottet som vist i figuren nedenfor.

Og du kan se, at plottet ikke er særlig glat – da du kun har valgt 10 point i intervallet.

Generelt gælder det, at jo større antal punkter du overvejer, jo jævnere vil plottet af funktionen være.

Konklusion

Her er en oversigt over, hvad vi har lært.

  • np.linspace(start, stop, num) returnerer en matrix af antal ligeligt fordelte tal i intervallet [start, stop].
  • Indstil det valgfri parameterendepunkt til Falsk for at udelukke stop, og indstil intervallet til[startstop)[startstop)
  • Indstil retstep til True for at få trinstørrelsen.
  • Generer jævnt fordelte arrays ved hjælp af np.linspace(), og brug derefter arrayet med matematiske funktioner.

Jeg håber, du nu forstår, hvordan np.linspace() virker. Du kan vælge at køre ovenstående eksempler i Jupyter-notesbogen. Tjek vores guide om Jupyter notebook eller andre Jupyter alternativer, du kan overveje.

Vi ses snart i en anden Python-tutorial. Indtil da, fortsæt med at kode!😀