Avansert: Arrays II#

Forutsetninger

Denne delen forutsetter at man har vært gjennom delkapitlet Arrays.

Her kommer det litt mer om arrays.

Vektorregning#

Arrays fungerer som vektorer fra matematikken.

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# Sum
print(a + b) -> [5 7 9]

# Differanse
print(a - b) -> [-3 -3 -3]

# Produkt
print(a * b) -> [4 10 18]

# Skalarprodukt/prikkprodukt
print(np.dot(a, b)) -> 32

# Kryssprodukt
print(np.cross(a, b)) -> [-3 6 -3]

arange()-funksjonen#

For å lage arrays med tall i stigende rekkefølge kan vi bruke arange()-funksjonen.

import numpy as np

print(np.arange(10))        # Alle tall fra og med 0 til 10
print(np.arange(1, 10))     # Alle tall fra og med 1 til 10
print(np.arange(0, 10, 2))  # Alle tall fra og med 0 til 10, men med steglengde 2
[0 1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[0 2 4 6 8]

På samme måte som i range()-funksjonen er slutten i arange()-funksjonen ikke inkluderende. Det vil si at den bare går til sluttverdien, ikke til og med.

concatenate()-funksjonen#

Hvis vi ønsker å legge sammen arrays til nye større arrays kan vi bruke concatenate()-funksjonen.

import numpy as np

arr1 = np.arange(1, 4)
arr2 = np.arange(1, 4)

print(np.concatenate((arr1, arr2)))
[1 2 3 1 2 3]

zeros()-funksjonen#

Hvis vi ønsker å fylle en array med mange nuller så kan vi bruke zeros()-funksjonen. Legger vi en tuppel (f.eks (3, 3)) inn som argument, så får vi en todimensjonell array.

import numpy as np

print(np.zeros(5)) # Lager en array med 5 nuller
print(np.zeros((3,3))) # Lager en 5x5 array med nuller
[0. 0. 0. 0. 0.]
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]

Det finnes også en funksjon som heter ones(). Kanskje du klarer å tenke deg frem til hva den gjør?

sort()-funksjonen#

For å få en sortert array (stigende) kan vi bruke sort()-funksjonen.

import numpy as np
from random import randint

arr = np.zeros(10) # Lager et array med nuller.

for n in range(len(arr)):
    arr[n] = randint(1, 10) # Setter hvert element til en tilfeldig verdi.

print("Array:", arr) # Skriver ut arrayet.
print("Sortert array:", np.sort(arr)) # Skriver ut det sorterte arrayet.
Array: [9. 6. 8. 6. 2. 3. 5. 9. 8. 4.]
Sortert array: [2. 3. 4. 5. 6. 6. 8. 8. 9. 9.]

flip()-funksjonen#

For å få en reversert array kan vi bruke flip()-funksjonen.

import numpy as np

arr = np.arange(1, 10)

print("Array:", arr)
print("Reversert array:", np.flip(arr))
Array: [1 2 3 4 5 6 7 8 9]
Reversert array: [9 8 7 6 5 4 3 2 1]

reshape()-funksjonen#

Hvis vi ønsker å gjøre endre på formen til en array kan vi bruke reshape()-funksjonen.

import numpy as np

arr = np.arange(1,10) # Lager en array med tallene fra og med en til 10.

print("Array:", arr)
print("Omformet (3, 3):")
print(np.reshape(arr, (3, 3))) # Omformer arrayet til (3, 3). 3 rader og 3 kolonner.
Array: [1 2 3 4 5 6 7 8 9]
Omformet (3, 3):
[[1 2 3]
 [4 5 6]
 [7 8 9]]

Finne elementer (indeksere)#

Vi kan indeksere og arrays på denne måten. Dette fungerer på samme måte som for lister både i én og to dimensjoner.

import numpy as np

arr = np.array([1, 2, 3])

print(arr[0]) # Skriver ut første element i listen
1

Vi kan indeksere 2d-arrays på denne måten.

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

print(arr) # Hele arrayen
print("Element i posisjon [0][0]: ", arr[0][0]) # Skriver elementet i første rad og første kolonne
print("Element i posisjon [1][1]: ", arr[1][1]) # Skriver elementet i andre rad og andre kolonne
[[1 2 3]
 [4 5 6]
 [7 8 9]]
Element i posisjon [0][0]:  1
Element i posisjon [1][1]:  5

shape()-funksjonen#

Vi ønsker noen ganger å se hvilken form en array har. Til det kan vi bruke shape()-funksjonen.

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6]])

print(np.shape(arr))
(2, 3)

Vi ser at formen på arrayet er 2x3. To rader og tre kolonner.

Legge til og trekke fra elementer#

Vi kan legge til elementer i arrays ved å bruke append()-funksjonen.

import numpy as np

arr = np.array([1, 2, 3]) # Lager et array som kalles arr
 
print(arr)

arr = np.append(arr, 4)   # Legger til elementet 4 på slutten av arrayet

print(arr)
[1 2 3]
[1 2 3 4]

Vi kan trekke fra elementer i arrays ved å bruke delete()-funksjonen.

import numpy as np

arr = np.array([1, 2, 3]) # Lager et array som kalles arr

print(arr)

arr = np.delete(arr, 0)   # Fjerner elementet med indeks 0

print(arr)
[1 2 3]
[2 3]

Vi ser at np.append() og np.delete() fungerer annerledes enn append()- og pop()-metodene i Python.

append()- og pop() legger til eller fjerner elementer i en liste in-place.

np.append() og np.delete() returnerer en ny array. Enten med et nytt element, eller med et element fjernet.


Oppgaver#

Oppgave 1

I denne oppgaven skal du lage flere arrays.

  1. Skriv ut en array som inneholder alle oddetallene fra og med 1 til og med 19.

  2. Skriv ut en array som inneholder alle oddetallene fra og med 1 til og med 19, baklengs.

  3. Skriv ut en 2d-array med dimensjonene (5, 5) og som er fylt med nuller.

  4. Skriv ut en 2d-array med dimensjonene (5, 5) og som er fylt med enere.

Oppgave 2

Lag en array med lengde 9 fylt med tilfeldige tall mellom 1 og 10 (inkluderende).

  1. Skriv ut arrayet.

  2. Skriv ut arrayet, sortert.

  3. Skriv ut det sorterte arrayet, omformet til et \(3\)x\(3\)-rutenett.

Oppgave 3

Skriv ut gangetabellen med alle tallene fra og med 1 til og med 10 ved å lage en todimensjonell array.

En mulig utskrift kan se slik ut:

[[  1   2   3   4   5   6   7   8   9  10]
 [  2   4   6   8  10  12  14  16  18  20]
 [  3   6   9  12  15  18  21  24  27  30]
 [  4   8  12  16  20  24  28  32  36  40]
 [  5  10  15  20  25  30  35  40  45  50]
 [  6  12  18  24  30  36  42  48  54  60]
 [  7  14  21  28  35  42  49  56  63  70]
 [  8  16  24  32  40  48  56  64  72  80]
 [  9  18  27  36  45  54  63  72  81  90]
 [ 10  20  30  40  50  60  70  80  90 100]]

Hint: Det kan være lurt å starte med å lage en array som np.zeros((10, 10)).astype(int). .astype()-metoden endrer arrayet slik at det i utgangspunktet blir fylt med heltall, ikke flyttall. Deretter må vi lage løkker for å indeksere og sette elementer i arrayet.

Bonus: Modifiser programmet slik at man kan skrive inn dimensjonene for gangetabellen