Lær NumPy linspace(): Lag jevnt fordelte tall i Python

Denne veiledningen vil introdusere deg for bruken av NumPy sin `linspace()`-funksjon for å generere en sekvens av tall med lik avstand i Python.

Vi vil først se på syntaksen til `linspace()`, og deretter utforske praktiske eksempler for å demonstrere hvordan den fungerer.

Viktig: For å følge denne veiledningen, sørg for at du har Python og NumPy installert.

Har du ikke NumPy? Vi har en rask installasjonsguide klar for deg.

La oss komme i gang!

Installere og Importere NumPy

La oss raskt se på trinnene for å installere NumPy før vi begynner med selve veiledningen.

⏩ Hvis du allerede har installert NumPy, kan du hoppe over dette avsnittet.

  • Dersom du bruker Google Colab, et skybasert Jupyter-notebookmiljø, kan du importere NumPy og begynne å skrive kode med en gang (anbefalt for denne veiledningen ✅).
  • Om du foretrekker å sette opp et lokalt miljø, anbefales Anaconda-distribusjonen av Python. Anaconda inneholder mange nyttige pakker forhåndsinstallert. Du kan laste ned installasjonsprogrammet som passer ditt operativsystem. Oppsettprosessen tar bare et par minutter. ⌛
  • Selv om du allerede har Python installert på datamaskinen, kan du fortsatt installere Anaconda-distribusjonen. Du kan bruke `conda` eller `pip` til å installere og administrere pakker. Kjør en av de følgende kommandoene fra Anaconda-ledeteksten for å installere NumPy.
# Installer NumPy med conda
conda install numpy

# Installer NumPy med pip
pip install numpy

Som neste steg, importer NumPy under aliaset `np` ved å kjøre kommandoen under. Dette tillater deg å referere til NumPy som `np` uten å måtte skrive `numpy` hver gang du skal bruke noe fra modulen.

import numpy as np

Heretter bruker vi punktnotasjon for å få tilgang til alle funksjoner i NumPy-biblioteket, slik: `np.`.

Viktigheten av tall med lik avstand

Når du arbeider med NumPy-matriser, oppstår det ofte behov for å lage en matrise med tall som har lik avstand innenfor et gitt intervall.

Før vi går videre, la oss se raskt på en annen lignende funksjon: `np.arange()`.

NumPy linspace() kontra NumPy arange()

Hvis du har brukt NumPy tidligere, har du sannsynligvis brukt `np.arange()` for å lage en rekke med tall innenfor et spesifisert område.

Du vet at `np.arange(start, stop, step)` returnerer en sekvens av tall fra `start` til, men ikke inkludert, `stop`, med et steg på `step`. Standard `step`-størrelse er 1.

Imidlertid er ikke alltid verdien for `step` like åpenbar. La oss se hvorfor det er tilfelle.

Hvis du for eksempel trenger 4 tall med lik avstand mellom 0 og 1, vet du at `step`-størrelsen må være 0,25. Men hvis du bruker `np.arange()`, vil den ikke inkludere stoppverdien 1. Derfor må du velge et intervall som går forbi stoppverdien.

Bildet under illustrerer noen eksempler der du trenger et bestemt antall punkter med lik avstand innenfor intervallet [a, b].

Punkter med lik avstand i et intervall.

Vårt første eksempel med 4 punkter med lik avstand i intervallet [0, 1] var ganske enkelt. Du vet at `step`-størrelsen mellom punktene skal være 0,25.

La oss se for oss et litt mer komplisert eksempel, der du må liste opp 7 punkter med lik avstand mellom 1 og 33. Her er ikke `step`-størrelsen like opplagt umiddelbart. Du kan imidlertid regne ut verdien for `step` manuelt i dette tilfellet.

Heldigvis er `np.linspace()` her for å gjøre ting enklere for deg! 😄

Med `np.linspace()` trenger du kun å oppgi antallet punkter innenfor intervallet, uten å måtte tenke på `step`-størrelsen. Du vil få matrisen du ønsker.

Med dette i bakhodet, la oss fortsette å lære om syntaksen til NumPy `linspace()` i neste avsnitt.

Syntaksen for NumPy linspace()

Syntaksen for bruk av NumPy `linspace()` er som følger:

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

I utgangspunktet kan denne syntaksen virke komplisert med mange parametere.

De fleste av disse parametrene er imidlertid valgfrie, og vi kommer frem til en enklere syntaks om bare et par minutter.

La oss begynne med å analysere syntaksen ovenfor:

  • `start` og `stop` er henholdsvis start- og sluttpunkt for intervallet. Både `start` og `stop` kan være skalarer eller matriser. I denne veiledningen begrenser vi oss til skalare start- og sluttverdier.
  • `num` er antallet punkter med lik avstand, og er en valgfri parameter med standardverdi 50.
  • `endpoint` er også en valgfri parameter, som enten kan være sann (`True`) eller usann (`False`).
  • Standardverdien er `True`, som betyr at sluttpunktet inkluderes i intervallet som standard. Du kan sette den til `False` for å ekskludere sluttpunktet.
  • `retstep` er enda en valgfri parameter, som tar boolske verdier (`True` eller `False`). Hvis den settes til `True`, returneres `step`-verdien.
  • `dtype` er datatypen til tallene i matrisen. Typen antas vanligvis å være flyttall, og trenger ikke spesifiseres eksplisitt.
  • `axis` er en annen valgfri parameter som angir aksen som tallene skal lagres langs. Dette er kun relevant når `start`- og `stop`-verdiene er matriser.

▶️ Så hva returnerer `np.linspace()`?

Funksjonen returnerer en N-dimensjonal matrise med tall med lik avstand. Hvis parameteren `retstep` settes til `True`, returneres også `step`-størrelsen.

Basert på det vi har diskutert så langt, er her en forenklet syntaks for bruk av `np.linspace()`:

np.linspace(start, stop, num)

Linjen med kode ovenfor returnerer en matrise med tall med lik avstand i intervallet [start, stop].

Nå som du kjenner syntaksen, la oss begynne å kode noen eksempler.

Hvordan lage matriser med lik avstand ved hjelp av NumPy linspace()

#1. I vårt første eksempel skal vi lage en matrise med 20 tall med lik avstand i intervallet [1, 5].

Du kan spesifisere verdiene for `start`, `stop` og `num` som nøkkelordargumenter. Dette vises 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.        ]

Merk at tallene i matrisen starter på 1 og slutter på 5 – inkludert begge sluttpunktene. Legg også merke til hvordan tallene, inkludert 1 og 5, representeres som flyttall i den returnerte matrisen.

#2. I forrige eksempel spesifiserte du verdiene for `start`, `stop` og `num` som nøkkelordargumenter. Hvis du sender inn argumentene i riktig rekkefølge, kan du like gjerne bruke dem som posisjonsargumenter, kun med verdiene, slik det vises 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. La oss nå lage en annen matrise der vi setter `retstep` til `True`.

Dette betyr at funksjonen nå returnerer både matrisen og trinnet. Vi kan pakke dem ut i to variabler, `arr3` for matrisen og `step_size` for den returnerte trinnstørrelsen.

Følgende kodecelle forklarer hvordan du gjør dette.

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. Til slutt, la oss sette `endpoint` til `False` og sjekke hva som skjer.

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 den returnerte matrisen ser du at 1 er inkludert, mens 5 ikke er det. Den siste verdien i matrisen er 4,8, men vi har fortsatt 20 tall.

Så langt har vi bare generert matriser med tall med lik avstand. I neste avsnitt skal vi visualisere disse tallene ved å plotte dem.

Hvordan plotte tall med lik avstand i et intervall

I denne delen skal vi bruke intervallet [10, 15] som et eksempel. Deretter skal vi bruke `np.linspace()` til å generere to matriser, med henholdsvis 8 og 12 punkter.

Når dette er gjort, kan vi bruke `plot()`-funksjonen fra `matplotlib`-biblioteket til å plotte dem.

For å gjøre det lettere å se, plasserer vi de to matrisene med henholdsvis N1 = 8 og N2 = 12 punkter på ulike posisjoner langs y-aksen.

Følgende kode 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'Tall med lik avstand i intervallet [{a},{b}]')
plt.xlabel('Intervall')

plt.show()

Det å generere punkter med lik avstand kan være nyttig når du arbeider med matematiske funksjoner. Vi lærer mer om dette i neste avsnitt.

Hvordan bruke NumPy linspace() med matematiske funksjoner

Etter at du har generert en sekvens av tall med lik avstand ved hjelp av `np.linspace()`, kan du beregne verdiene for matematiske funksjoner i det aktuelle intervallet.

I kodecellen under genererer vi først 50 punkter med lik avstand i intervallet 0 til 2π. Deretter lager vi matrisen `y` ved å bruke `np.sin()` på matrisen `x`. Merk at du kan utelate `num`-parameteren, siden standardverdien er 50. Vi vil likevel bruke den eksplisitt her.

Som neste steg plotter vi sinusfunksjonen i intervallet [0, 2π]. For å gjøre dette bruker vi matplotlib, som i det forrige eksemplet. Spesielt bruker vi `plot()`-funksjonen i `matplotlib.pyplot` for å lage et linjediagram.

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()

Kjør koden ovenfor med `N` lik 10. Du vil få plottet som vises i figuren under.

Som du ser er ikke plottet særlig glatt, ettersom vi kun har valgt 10 punkter i intervallet.

Generelt gjelder at jo større antall punkter du vurderer, desto glattere vil plottet til funksjonen bli.

Konklusjon

Her er en oppsummering av det vi har lært:

  • `np.linspace(start, stop, num)` returnerer en matrise med `num` antall tall med lik avstand i intervallet [start, stop].
  • Sett den valgfrie parameteren `endpoint` til `False` for å ekskludere `stop`, og sett intervallet til [start, stop).
  • Sett `retstep` til `True` (valgfritt) for å få `step`-størrelsen.
  • Generer matriser med lik avstand ved å bruke `np.linspace()`, og bruk deretter matrisen med matematiske funksjoner.

Jeg håper du nå forstår hvordan `np.linspace()` fungerer. Du kan gjerne prøve ut eksemplene ovenfor i en Jupyter notebook. Sjekk ut vår veiledning om Jupyter notebooks eller andre Jupyter-alternativer du kan vurdere.

Vi sees igjen i en annen Python-veiledning. Inntil da, fortsett å kode! 😀