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()
../_images/kap4_34_0.png

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