Numpy

Numpy er en av de mestbrukte eksterne biblioteker for Python. Ved bruk av den nye datatypen numpy.array kan vi lagre store mengder numerisk data på en effektiv måte.

For mer detalj, se på https://numpy.org/doc/stable/user/absolute_beginners.html

numpy.array

Vi kan lage et array direkte fra en liste og vi kan bruke den samme indeks-notasjonen:

import numpy as np

a = np.array([1., 4., 5., 8.])
print(a)
print(type(a))
print(a[:2])
print(a[3])
a[1:3] = 99
print(a)
a[:] = 11
print(a)

For flerdimensionale (nøstete) arrays har vi en enklere indeks-notasjon:

a = np.array( [ [1., 2., 3.], [4., 5., 6.] ] )
print(a[0,0] )   # a[0][0]
print(a[1,2] )   # a[1][2]
print(a.shape)

Vi kan ha (nesten) så mange dimensjoner vi vil. Her er et 3D array:

b = np.array([[[111., 112.], [121., 122.]], [[211., 212.], [221., 222.]]])
print(b)
print(b.shape)
print(b[1,1,1])
print(b[0,0,0])
Oversikt over NumPy Array-funksjoner

Det finnes flere hjelpefunksjoner for å lage nye arrays. For hver metode nedenfor, kan du fortelle hva skjer?

arange =np.arange(1., 2., 0.1)   # fast skrittstørrelse
print(arange)
linspace = np.linspace(30,40,5)     # fast start/end, fast antall verdier
print(linspace)
ones = np.ones((2,3))
print(ones)

zeros = np.zeros(7)
print(zeros)

full_array = np.full((2,2), 7.)
print(full)

random = np.random.random_sample((2,2))
print(random)
Matematiske operasjoner

Alle matematiske operasjonene skjer samtidig for alle elementer, vi bør ikke skrive en løkke:

import numpy as np
a = np.arange(10.)
print(a)
# [[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.]]
b = a + 7
print(b)
# [[ 7.   8.   9.  10.  11.  12.  13.  14.  15.  16. ]]
c = b ** 2
print(c)
# [[ 49.   64.   81.  100.  121.  144.  169.  196.  225.  256. ]]
print(c - b)
print(a + b)
print(b * a)
print(np.sin(a))
Matriseregning

Numpy kan også brukes til matriseregning

a = np.array( [ [1., 2.], [3., 4.] ] )
b = np.array( [ [4., 3.], [2., 1.] ] )
dot = np.dot(a, b)                           # matrise-multiplikasjon ("matrix dot product")
print(dot)

a_at_b = a @ b                                  # lettere måte å skrive det samme ("a ganger b")
print(a_at_b)

a_star_b = a_a * b                                  # OBS: ikke matrise-multiplikasjon
print(a_star_b)
det = np.linalg.det(b)                       # determinanten til en matrise
print(det)

inv = np.linalg.inv(b)                       # inversen til en matrise
print(inv)

b_at_inv_b = b @ np.linalg.inv(b)                   # b ganger sin egen invers er identiteten (hurra)
print(b_at_inv_b)

Numpy kan stort sett gjøre alt du trenger med matriser. Alle funksjonene finnes her: https://numpy.org/doc/stable/reference/routines.linalg.html

Numpy og matplotlib

numpy og matplotlib er enkelt å bruke sammen:

import numpy as np
import matplotlib.pyplot as plt

xs = np.linspace(0, 5, 100)
ys = np.sin(xs) + 1/3 * np.sin(3 * xs)

plt.plot(xs, ys)
plt.show()
Sammenligne arrays

Vi kan også sammenligne arrays, resultatet blir et array av bool:

a = np.array([[6, 4], [5, 9]])
print(a >= 6)

Slike boolean-arrays kan brukes som index:

a = np.arange(10.)
filt = a ** 2 > 25   # kvadrat større enn 25
print(a[filt])

Og i vår plot-eksempel:

import numpy as np
import matplotlib.pyplot as plt

xs = np.linspace(0, 5, 100)
ys = np.sin(xs)

ys[ys > 0.5] = 0.5    # Hva skjer her? Hvilke verdier endres?
ys[ys < -0.5] = -0.5  # Hva skjer her? Hvilke verdier endres?

plt.plot(xs, ys)
plt.show()
Større numpy/matplotlib eksempler

Ny innhold i disse eksemplene er ikke pensum, som f.eks animasjoner. Flere eksempler ligger også på mitt.uib - Moduler - Uke 13