Numpy kan installeres ved å bruke et pakkehåndteringssystem som pip eller conda. For eksempel, for å installere numpy med pip, kan du kjøre følgende kommando i terminalen
pip install numpyI jupyer lite kan du installere numpy ved å bruke følgende kommando i en celle:
%pip install numpyVi kan nå importere numpy på følgende måte:
import numpyMen, de flere som bruker numpy, bruker ofte aliaset np for å gjøre koden mer kompakt. Dette gjøres ved å skrive:
import numpy as npVi kan np bruke np på samme måte som vi ville brukt numpy.
Oppgave¶
Prøv å importere math som noe annet ved å bruke et alias (for eksempel m). Har du fortsatt den samme funksjonaliteten?
Numpy arrays¶
Numpy arrays minner om lister i python men det er flere vesentlige forskjeller. En av de viktigste forskjellene er at numpy arrays er mer effektive når det gjelder ytelse og minnebruk, spesielt for store datasett. Dette skyldes at numpy arrays er implementert i C og bruker kontinuerlig minneallokering, mens python lister er mer fleksible og kan inneholde elementer av forskjellige datatyper. La oss lage et numpy array og sammenligne det med en liste.
x_liste = [1, 2, 3, 4, 5]
print(x_liste)
x_array = np.array([1, 2, 3, 4, 5])
print(x_array)Si nå at vi ønsker å lage en ny liste hvor alle elementene er doblet. Dette kan vi gjøre på følgende måte med en liste
x_dobbel_liste = [2 * x for x in x_liste]
print(x_dobbel_liste) I numpy kan vi gjøre dette på en mye enklere måte:
x_dobbel_array = 2 * x_array
print(x_dobbel_array)Prøv å se hva som skjer hvis du prøver å gjøre det samme med en liste (alså 2 * x_liste)
# 2 * x_listeVi skal nå se på hvordan man kan lage numpy arrays på samme måte som vi brukte range tidligere. Merk at vi kan gjøre en range om til en liste ved å bruke list(range(...))
y_list = list(range(1, 12, 3))
print(y_list)I numpy har vi en tilsvarende funksjon som heter np.arange(...) som lager et numpy array med samme type elementer. La oss lage et numpy array som tilsvarer list(range(1, 12, 3))
y_array = np.arange(1, 12, 3)
print(y_array)Oppgave - ta tiden på numpy vs liste¶
Gitt et array x_array org en list x_list av størrelse N
N = 100_000
x_array = np.arange(0, N)
x_list = list(range(0, N))sjekk hvor lang tid du bruker på doble verdiene ved å bruke liste versus array
Dobbelklikk for hint
# Tid for liste# Tid for arrayDobbelklikk for løsning
En annen fordel med np.arange er at vi kan lage arrays med desimaler. La oss lage et array som starter på 0, slutter på 2 og har steg på 0.3
y = np.arange(0, 2, 0.3)
print(y)Her må man være litt påpasselig med at siste element ikke nødvendigvis er med i arrayet. Det er også viktig å merke seg at flyttall kan ha små avrundingsfeil. Ett klassisk eksempel er at 0.1 + 0.2 ikke nødvendigvis er nøyaktig lik 0.3 i et flyttallssystem.
0.1 + 0.2 == 0.30.1 + 0.2En annen nyttig funksjon for å lage numpy arrays er np.linspace(...) som lager et array med et gitt antall jevnt fordelte punkter mellom to grenser. La oss lage et array med 5 punkter mellom 0 og 1.
y = np.linspace(0, 1, 5)
print(y)Her ser vi også at endepunktet er inkludert i arrayet.
Oppgave¶
Se om du finner ut hvordan du kan lage et array med 5 punkter mellom 0 og 1 hvor endepunktet ikke er inkludert.
Dobbelklikk for hint
# Skriv løsning herDobbelklikk for løsning
Vi kan også anvende funksjoner på numpy arrays. For eksempel kan vi bruke np.sin(...) for å finne sinus til alle elementene i et array.
x = np.linspace(0, 4 * np.pi, 100)
y = np.sin(x)
print(y)Her blir det litt rotete å printe ut alle verdiene, så her er det mer fornuftig å plotte dem. For dette kan vi bruke et annet bibliotek som heter matplotlib. Dette biblioteket kan installeres på samme måte som numpy, for eksempel ved å bruke pip:
pip install matplotlib%pip install matplotlibHer er det igjen også mulig å kun bruke
import matplotlibmen matplotlib inneholder flere moduler, og plotte-funksjonaliteten (som vi er interresert i) ligger i del-pakken pyplot. Dette blir alt for langt å skrive hver gang, så vi bruker ofte aliaset plt for denne pakken.
import matplotlib.pyplot as pltVi kan nå plotte sinus funksjonen ved å bruke plt.plot(...) funksjonen:
plt.plot(x, y)Det å bare rask plotte noe med matplotlib er veldig enkelt, men ofte ønsker man å tilpasse plottene litt mer. For dette er det ofte best å lage en figur og en akse først, og så plotte på aksen. Dette kan gjøres på følgende måte:
fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()I koden over har vi laget en figur (fig) og en akse (ax). Vi kan nå bruke ax.plot(...) for å plotte på aksen, og plt.show() for å vise figuren.
Vi kan bruke ax til å tilpasse aksen, for eksempel ved å legge til tittel og etiketter på aksene. Her er et eksempel hvor vi legger til tittel, etiketter og rutenett:
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title("Sinus funksjon")
ax.set_xlabel("x verdier")
ax.set_ylabel("sin(x) verdier")
ax.grid()
plt.show()Det er også ofte vanlig å plotte flere datasett i samme figur. Dette kan gjøres ved å kalle ax.plot(...) flere ganger. For eksempel kan vi plotte både sinus og cosinus i samme figur
y_sin = np.sin(x)
y_cos = np.cos(x)
fig, ax = plt.subplots()
ax.plot(x, y_sin, label="sin(x)")
ax.plot(x, y_cos, label="cos(x)")
ax.set_title("Sinus og Cosinus funksjoner")
ax.set_xlabel("x verdier")
ax.set_ylabel("y verdier")
ax.legend()
ax.grid()
plt.show()Her har vi lagt til en legende for å skille de to kurvene. Vi har også brukt forskjellige farger og linjestiler for å gjøre det tydeligere. Hvis vi ønsker en spesiell farge eller linjestil, kan vi spesifisere dette som argumenter i ax.plot(...) funksjonen. For eksempel
fig, ax = plt.subplots()
ax.plot(x, y_sin, label="sin(x)", linestyle='--', color='blue')
ax.plot(x, y_cos, label="cos(x)", linestyle='-', color='red')
ax.set_title("Sinus og Cosinus funksjoner")
ax.set_xlabel("x verdier")
ax.set_ylabel("y verdier")
ax.legend()
ax.grid()
plt.show()Oppgave¶
Plot funksjonene tan(x) og exp(x) i samme figur for x mellom -1 og 1. Prøv å bruke forskjellige farger og linjestiler for de forskjellige funksjonene. Husk å legge til en legende, tittel og etiketter på aksene.
# Skriv løsning herDobbelklikk for løsning
Operasjoner på arrays¶
Vi har sett at vi kan bruke funksjoner som np.sin(...) på numpy arrays. Dette fungerer for mange matematiske funksjoner som np.cos(...), np.tan(...), np.exp(...), np.log(...), osv. I tillegg kan vi også bruke vanlige matematiske operasjoner som +, -, *, /, og ** på numpy arrays. Disse operasjonene blir da utført elementvis på arrayet. For eksempel:
x = np.linspace(0, 1, 100)
y = (x - 0.5) ** 2
z = (x - 0.1) * (x - 0.9) * (x - 0.5)
fig, ax = plt.subplots()
ax.plot(x, y, label="(x - 0.5)^2", color='green')
ax.plot(x, z, label="(x - 0.1)(x - 0.9)(x - 0.5)", color='orange')
ax.set_title("To polynom funksjoner")
ax.set_xlabel("x verdier")
ax.set_ylabel("y verdier")
ax.legend()
ax.grid()
plt.show()Oppgave¶
Plot funksjonen
og
i samme plot, hvor ligger mellom og .
Start med N = 1 og øk N for å se hva som skjer.
Dobbelklikk for hint 1
Dobbelklikk for løsning
Summen du ser kalles for Taylor rekken til sinus. De fleste funksjoner kan tilnærmes ved å bruke et endelig antall ledd til Taylor rekken og dette er en vanlig metode når man ønsker å beregne funksjoner på en datamaskin. Hvordan tror du for eksempel en kalkulator regner ut sinus til et tall? :)
Oppgave¶
Regn ut hvor stor feil som gjøres når du bruker Taylor rekken til sinus for ulike N. Bruk for eksemepel x = 0.5
Dobbelklikk for løsning