Hvordan lage matriser med jevnt fordelte tall

Denne opplæringen vil lære deg hvordan du bruker NumPy linspace() for å lage en rekke med jevnt fordelte tall i Python.

Du vil lære syntaksen til NumPy linspace(), etterfulgt av eksempler som vil hjelpe deg å forstå hvordan du bruker den.

Merk: For å følge med på denne opplæringen, må du ha Python og NumPy installert.

Har du ikke NumPy ennå? Vi har satt sammen en rask installasjonsguide for deg.

La oss begynne!

Installer og importer NumPy

Før du starter opplæringen, la oss raskt gå gjennom trinnene for å installere NumPy-biblioteket.

⏩ Hvis du allerede har NumPy installert, kan du gjerne hoppe til neste seksjon.

  • Hvis du bruker Google Colab – et skybasert Jupyter-notebookmiljø, kan du importere NumPy og begynne å kode med en gang. (anbefalt for denne opplæringen ✅)
  • Hvis du vil sette opp et lokalt arbeidsmiljø, anbefaler jeg å installere Anaconda-distribusjonen av Python. Anaconda kommer med flere nyttige pakker forhåndsinstallert. Du kan laste ned installasjonsprogrammet for ditt operativsystem. Konfigurasjonsprosessen tar bare noen få minutter.⌛
  • Hvis du allerede har Python installert på datamaskinen din, kan du fortsatt installere Anaconda-distribusjonen. Du kan bruke conda eller pip for å installere og administrere pakker. Du kan kjøre en av følgende kommandoer fra Anaconda-ledeteksten for å installere NumPy.
# Install NumPy using conda
conda install numpy

# Install NumPy using pip
pip install numpy

Som et neste trinn, importer numpy under aliaset np ved å kjøre følgende kommando. Å gjøre dette vil hjelpe deg å referere til NumPy som np – uten å måtte skrive ned numpy hver gang du får tilgang til et element i modulen.

import numpy as np

Fremover vil vi bruke punktnotasjonen for å få tilgang til alle funksjonene i NumPy-biblioteket slik: np..

Saken for jevnt fordelte tall

Når du arbeider med NumPy-matriser, er det tider når du må lage en matrise med jevnt fordelte tall i et intervall.

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

NumPy linspace() vs. NumPy arange()

Hvis du har brukt NumPy før, ville du sannsynligvis ha brukt np.arange() for å lage en rekke tall innenfor et spesifisert område.

  Kjør klassiske spill på din PC med disse 6 emulatorene

Du vet at np.arange(start, stop, step) returnerer en rekke tall fra start til men ikke inkludert stopp, i trinnvis; standard trinnstørrelse er 1.

Men verdien av trinn er kanskje ikke alltid åpenbar. La oss se hvorfor dette er tilfelle.

For eksempel, hvis du trenger 4 jevnt fordelte tall mellom 0 og 1, vet du at trinnstørrelsen må være 0,25. Men hvis du bruker np.arange(), inkluderer den ikke stoppverdien 1. Så du må velge et intervall som går utover stoppverdien.

Følgende bilde illustrerer noen flere eksempler der du trenger et spesifikt antall jevnt fordelte punkter i intervallet [a, b].

Jevnt fordelte punkter i et intervall

Vårt første eksempel på 4 jevnt fordelte punkter inn [0,1] var lett nok. Du vet at trinnstørrelsen mellom punktene skal være 0,25.

Anta at du har et litt mer involvert eksempel – der du måtte liste opp 7 jevnt fordelte punkter mellom 1 og 33. Her er det ikke sikkert at trinnstørrelsen er veldig tydelig umiddelbart. Du kan imidlertid regne ut verdien av trinn manuelt i dette tilfellet.

Imidlertid er np.linspace() her for å gjøre det enda enklere for deg! 😄

Bruk NumPy linspace

Når du bruker np.linspace(), trenger du bare å spesifisere antall punkter i intervallet – uten å bekymre deg for trinnstørrelsen. Og du vil få tilbake arrayet som ønsket.

Med denne motivasjonen, la oss fortsette å lære syntaksen til NumPy linspace() i neste seksjon.

Syntaks for NumPy linspace()

Syntaksen for bruk av NumPy linspace() er vist nedenfor:

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

I utgangspunktet kan syntaksen ovenfor virke veldig komplisert med mange parametere.

De fleste av dem er imidlertid valgfrie parametere, og vi kommer frem til en mye enklere syntaks på bare et par minutter.

La oss nå starte med å analysere syntaksen ovenfor:

  • start og stopp er henholdsvis start- og sluttpunkt for intervallet. Både start og stopp kan være skalarer eller matriser. Vi vil begrense oss til skalære start- og sluttverdier i denne opplæringen.
  • num er antall jevnt fordelte punkter. Og det er en valgfri parameter med en standardverdi på 50.
  • endepunkt er også en valgfri parameter som kan være enten sant eller usant.
  • Standardverdien er True, som betyr at sluttpunktet vil inkluderes i intervallet som standard. Du kan imidlertid sette den til False for å ekskludere sluttpunktet.
  • retstep er enda en valgfri parameter som tar boolerne True eller False. Når satt til True, returneres trinnverdien.
  • dtype er datatypen til tallene i matrisen. Typen antas vanligvis som flytende og trenger ikke angis eksplisitt.
  • akse er en annen valgfri parameter som angir aksen som tallene skal lagres langs. Og dette er bare relevant når start- og stoppverdiene er arrays selv.
  Hva er Microsoft Network Adapter Multiplexor Protocol?

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

Den returnerer en N-dimensjonal matrise med jevnt fordelte tall. Og hvis parameteren retstep er satt til True, returnerer den også trinnstørrelsen.

Basert på diskusjonen så langt, her er en forenklet syntaks for å bruke np.linspace():

np.linspace(start, stop, num)

Kodelinjen ovenfor vil returnere en matrise med tall med jevnt fordelte tall i intervallet [start, stop].

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

Hvordan lage jevnt fordelte matriser med NumPy linspace()

#1. Som vårt første eksempel, la oss lage en matrise med 20 jevnt fordelte tall 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.        ]

Legg merke til hvordan tallene i matrisen starter på 1 og slutter på 5 – inkludert begge sluttpunktene. Se også hvordan tallene, inkludert punktene 1 og 5, er representert som flytende i den returnerte matrisen.

#2. I forrige eksempel hadde du angitt verdiene for start, stop og num som søkeordargumenter. Hvis du sender inn argumentene i riktig rekkefølge, kan du like godt bruke dem som posisjonsargumenter med bare verdiene, 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. La oss nå lage en annen matrise der vi setter retstep til True.

Dette betyr at funksjonen nå vil returnere både matrisen og trinnet. Og vi kan pakke dem ut i to variabler arr3: matrisen og step_size: den returnerte trinnstørrelsen.

Følgende kodecelle forklarer hvordan du kan gjø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 siste eksempel, la oss sette endepunkt 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 kan du se at 1 er inkludert, mens 5 ikke er inkludert. Og den siste verdien i matrisen er tilfeldigvis 4,8, men vi har fortsatt 20 tall.

  Hvordan dempe varsler på iPhone

Så langt har vi bare generert matriser med jevnt fordelte tall. I neste avsnitt, la oss visualisere ved å plotte disse tallene.

Hvordan plotte jevnt fordelte tall i et intervall

I denne delen, la oss velge [10,15] som interesseintervall. Og bruk deretter np.linspace() til å generere to arrays, hver med henholdsvis 8 og 12 poeng.

Etter at dette er fullført, kan vi bruke plottefunksjonen fra matplotlib-biblioteket til å plotte dem.

For klarhets skyld klemmer vi de to matrisene med N1 = 8 og N2 = 12 jevnt fordelte punkter på forskjellige posisjoner langs y-aksen.

Følgende kodebit 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()

Å generere jevnt fordelte punkter kan være nyttig når du arbeider med matematiske funksjoner. Vi lærer om det i neste avsnitt.

Hvordan bruke NumPy linspace() med matematiske funksjoner

Etter at du har generert en rekke med jevnt fordelte tall ved hjelp av np.linspace(), kan du beregne verdiene til matematiske funksjoner i intervallet.

I kodecellen nedenfor genererer du først 50 jevnt fordelte punkter i intervallet 0 til 2π. Og lag deretter matrisen y ved å bruke np.sin() på matrisen x. Merk at du kan hoppe over num-parameteren, siden standardverdien er 50. Vi vil fortsatt bruke den eksplisitt.

Som et neste trinn kan du plotte sinusfunksjonen i intervallet [0, 2π]. For å gjøre dette kan du bruke matplotlib, som i forrige eksempel. Nærmere bestemt brukes plot()-funksjonen i matplotlib.pytplot til å lage et linjeplott.

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 nå koden ovenfor ved å sette N lik 10. Du får plottet som vist i figuren nedenfor.

Og du kan se at plottet ikke er veldig jevnt – siden du bare har valgt 10 poeng i intervallet.

Generelt, jo større antall poeng du vurderer, jo jevnere vil plottet til funksjonen være.

Konklusjon

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

  • np.linspace(start, stopp, num) returnerer en matrise med antall jevnt fordelte tall i intervallet [start, stop].
  • Sett det valgfrie parameterendepunktet til False for å ekskludere stopp, og sett intervallet til[startstopp)[startstop)
  • Sett restep til True valgfritt for å få trinnstørrelsen.
  • Generer jevnt fordelte arrays ved å bruke np.linspace(), og bruk deretter arrayen med matematiske funksjoner.

Jeg håper du nå forstår hvordan np.linspace() fungerer. Du kan velge å kjøre eksemplene ovenfor i Jupyter-notisboken. Sjekk ut vår guide om Jupyter bærbare, eller andre Jupyter-alternativer du kan vurdere.

Vi sees snart i en annen Python-opplæring. Inntil da, fortsett å kode!😀