4. Datastrukturer
Contents
4. Datastrukturer#
Underveisoppgaver#
Underveisoppgave 4.1#
Vi kjører koden og ser hva output blir:
import numpy as np
tall = np.array([1, 4, 4, 85, 93, 1])
print(tall[2], tall[3:], tall[-1], tall[:4])
4 [85 93 1] 1 [ 1 4 4 85]
Underveisoppgave 4.2#
Det kan være fint å finne oppgaver om skalarprodukt, siden det er enkelt å kontrollere for hånd. Så kan en se på om vektorer står ortogonalt og til slutt oppgaver med vinkel mellom vektorer.
Underveisoppgave 4.3#
import numpy as np
import time
a = np.linspace(0, 10, 100000)
b = np.linspace(2, 12, 100000)
c = np.zeros(100000)
t0 = time.time()
for i in range(len(a)):
c[i] = a[i] * b[i]
t1 = time.time()
print("Det tok", (t1-t0)*1000, "ms")
Det tok 63.287973403930664 ms
Så bruker vi den vektoriserte *
-operasjonen, som betyr elementvis multiplikasjon.
import numpy as np
import time
a = np.linspace(0, 10, 100000)
b = np.linspace(2, 12, 100000)
c = np.zeros(100000)
t0 = time.time()
c = a*b
t1 = time.time()
print("Det tok", (t1-t0)*1000, "ms")
Det tok 0.2779960632324219 ms
Det gikk mye raskere!
Underveisoppgave 4.4#
Erratum:
Første setning i oppgaven skal lyde:
Sett sammen de fire kodesnuttene over og kjør koden.
import numpy as np
N = 100
r = np.zeros((N,2))
t = np.zeros(N)
v0 = np.array([4, 7])
a = np.array([0, -9.81])
for i in range(N):
for j in range(2):
r[i,j] = v0[j]*t[i] + 0.5*a[j]*t[i]**2
r[:,0] = 4*t
r[:,1] = 7*t - 9.81*t**2
print(r[0,0])
0.0
print(r[1,1])
0.0
print(r[0,:])
[0. 0.]
print(r[:,0])
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0.]
print(r[1,:])
[0. 0.]
print(r[:,1])
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0.]
Underveisoppgave 4.5#
atom_masse = {"H": 1.008, "He": 4.003, "Li": 6.940, "Be": 9.012}
atom_masse = {
"H": 1.008, "He": 4.003,
"Li": 6.940, "Be": 9.012
}
atom_masse = {"H": 1.008,
"He": 4.003,
"Li": 6.940,
"Be": 9.012
}
atom_masse = { "H": 1.008
, "He": 4.003
, "Li": 6.940
, "Be": 9.012
}
atom_masse = {"H": 1.008,
"He": 4.003,
"Li": 6.940,
"Be": 9.012}
Arrayer#
Oppgave 1#
import numpy as np
a1 = np.array([1, 2, 3])
a2 = np.array([9, 8, 7])
a3 = a1 + a2
print(a3)
[10 10 10]
Oppgave 2#
import numpy as np
a1 = np.array([1, 2, 3])
a2 = np.array([9, 8, 7])
a3 = a1 * a2
print(a3)
[ 9 16 21]
Oppgave 3#
La oss prøve å kjøre programmet
from matplotlib.pylab import plt
from numpy import *
x = np.linspace(0, 2, 100)
y = np.sqrt(x)
plt.plot(x, y)
plt.show()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-1-ca400701c8ef> in <module>
1 from matplotlib.pylab import plt
2 from numpy import *
----> 3 x = np.linspace(0, 2, 100)
4 y = np.sqrt(x)
5 plt.plot(x, y)
NameError: name 'np' is not defined
Første gang vi kjører programmet får vi en feilmelding som handler om at np
ikke er definert. Det er fordi vi har importert alle funksjonene fra numpy med *
. La oss derfor bytte til import numpy as np
, da fungerer programmet fint.
from matplotlib.pylab import plt
import numpy as np
x = np.linspace(0, 2, 100)
y = np.sqrt(x)
plt.plot(x, y)
plt.show()
Oppgave 4#
import numpy as np
nigangen = np.array(range(9, 1001, 9))
print(nigangen)
[ 9 18 27 36 45 54 63 72 81 90 99 108 117 126 135 144 153 162
171 180 189 198 207 216 225 234 243 252 261 270 279 288 297 306 315 324
333 342 351 360 369 378 387 396 405 414 423 432 441 450 459 468 477 486
495 504 513 522 531 540 549 558 567 576 585 594 603 612 621 630 639 648
657 666 675 684 693 702 711 720 729 738 747 756 765 774 783 792 801 810
819 828 837 846 855 864 873 882 891 900 909 918 927 936 945 954 963 972
981 990 999]
Oppgave 5#
import numpy as np
tall = np.zeros(100)
for i in range(1, 101):
tall[i-1] = i**2
print(tall)
[1.000e+00 4.000e+00 9.000e+00 1.600e+01 2.500e+01 3.600e+01 4.900e+01
6.400e+01 8.100e+01 1.000e+02 1.210e+02 1.440e+02 1.690e+02 1.960e+02
2.250e+02 2.560e+02 2.890e+02 3.240e+02 3.610e+02 4.000e+02 4.410e+02
4.840e+02 5.290e+02 5.760e+02 6.250e+02 6.760e+02 7.290e+02 7.840e+02
8.410e+02 9.000e+02 9.610e+02 1.024e+03 1.089e+03 1.156e+03 1.225e+03
1.296e+03 1.369e+03 1.444e+03 1.521e+03 1.600e+03 1.681e+03 1.764e+03
1.849e+03 1.936e+03 2.025e+03 2.116e+03 2.209e+03 2.304e+03 2.401e+03
2.500e+03 2.601e+03 2.704e+03 2.809e+03 2.916e+03 3.025e+03 3.136e+03
3.249e+03 3.364e+03 3.481e+03 3.600e+03 3.721e+03 3.844e+03 3.969e+03
4.096e+03 4.225e+03 4.356e+03 4.489e+03 4.624e+03 4.761e+03 4.900e+03
5.041e+03 5.184e+03 5.329e+03 5.476e+03 5.625e+03 5.776e+03 5.929e+03
6.084e+03 6.241e+03 6.400e+03 6.561e+03 6.724e+03 6.889e+03 7.056e+03
7.225e+03 7.396e+03 7.569e+03 7.744e+03 7.921e+03 8.100e+03 8.281e+03
8.464e+03 8.649e+03 8.836e+03 9.025e+03 9.216e+03 9.409e+03 9.604e+03
9.801e+03 1.000e+04]
Oppgave 6#
Vi sjekker om prikkproduktet blir null.
import numpy as np
v = np.array([1, -1, 0])
w = np.array([2, 2, 3])
prikk = np.dot(v, w)
print("prikkproduktet er", prikk)
prikkproduktet er 0
Siden prikkproduktet er 0 konkluderer vi med at vektorene står ortogonalt på hverandre.
Tupler#
Oppgave 7#
svart = (0, 0, 0)
rød = (255, 0, 0)
grønn = (0, 255, 0)
blå = (0, 0, 255)
hvit = (255, 255, 255)
Oppgave 8#
a = (3, 5)
b = (4, 6)
norm_a = (a[0]**2+a[1]**2)**0.5
print("Lengden av a er", norm_a)
norm_b = (b[0]**2+b[1]**2)**0.5
print("Lengden av b er", norm_b)
prikk = a[0]*b[0] + a[1]*b[1]
print("Prikkproduktet av a og b er", prikk)
from numpy import arccos, degrees
vinkel = arccos(prikk/(norm_a*norm_b))
print("Vinkelen mellom a og b er", degrees(vinkel), "grader")
Lengden av a er 5.830951894845301
Lengden av b er 7.211102550927978
Prikkproduktet av a og b er 42
Vinkelen mellom a og b er 2.7263109939063455 grader
ax = int(input("x-komponent av a:"))
ay = int(input("y-komponent av a:"))
bx = int(input("x-komponent av b:"))
by = int(input("y-komponent av b:"))
a = (ax, ay)
b = (bx, by)
norm_a = (a[0]**2+a[1]**2)**0.5
print("Lengden av a er", norm_a)
norm_b = (b[0]**2+b[1]**2)**0.5
print("Lengden av b er", norm_b)
prikk = a[0]*b[0] + a[1]*b[1]
print("Prikkproduktet av a og b er", prikk)
from numpy import arccos, degrees
vinkel = arccos(prikk/(norm_a*norm_b))
print("Vinkelen mellom a og b er", degrees(vinkel), "grader")
x-komponent av a: 3
y-komponent av a: 5
x-komponent av b: 4
y-komponent av b: 6
Lengden av a er 5.830951894845301
Lengden av b er 7.211102550927978
Prikkproduktet av a og b er 42
Vinkelen mellom a og b er 2.7263109939063455 grader
Om vi gjør det samme med arrayer slipper vi å lage så omfattende utrykk for lengde og prikkprodukt av vektorene, fordi vi kan bruke array-operasjoner i numpy.
Dictionarier#
Oppgave 9#
elever = ["Peder", "Elias", "Nora"]
lærere = ["Einar"]
klasseliste = {}
klasseliste["Lærer"] = lærere[0]
klasseliste["Elev 1"] = elever[0]
klasseliste["Elev 2"] = elever[1]
klasseliste["Elev 3"] = elever[2]
Oppgave 10#
farger = {"Rød": (255, 0, 0), "Grønn": (0, 255,0), "Blå": (0, 0, 255), "Gul": (255, 255, 0), "Turkis": (0, 255,255)}
for farge in farger.keys():
print("RGB-koden for", farge, "er", farger[farge])
RGB-koden for Rød er (255, 0, 0)
RGB-koden for Grønn er (0, 255, 0)
RGB-koden for Blå er (0, 0, 255)
RGB-koden for Gul er (255, 255, 0)
RGB-koden for Turkis er (0, 255, 255)
Oppgave 11#
Kommer etterhvert