Uke 13 — 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 i en effektiv måte.

Eksempler

Vi kan lage et array direkte fra en liste (prøv dette i en REPL), og vi kan bruke den samme indeks-notasjonen:

>>> import numpy as np
>>> a = np.array([1., 4., 5., 8.])
>>> a
array([1., 4., 5., 8.])
>>> type(a)

<type 'numpy.ndarray’>
>>> a[:2]
array([1., 4.])
>>> a[3]
8.0
>>> a[1:3] = 99
>>> a
array([1., 99., 99., 8.])
>>> a[:] = 11
>>> a
array([11., 11., 11., 11.])

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

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

Det finnes flere hjelpefunksjoner for å lage nye arrays:

>>> np.arange(1., 2., 0.1)   # fast skrittstørrelse
array([1. , 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9])

>>> np.linspace(30,40,5)     # fast start/end, fast antall verdier
array([ 30. , 32.5, 35. , 37.5, 40. ])

>>> np.ones((2,3))
array([[ 1., 1., 1.],

       [ 1., 1., 1.]])

>>> np.zeros(7)
array([0., 0., 0., 0., 0., 0., 0.])

>>> np.full((2,2), 7.)
array([[7., 7.], [7., 7.]])

>>> np.random.random_sample((2,2))
array([[0.33896244, 0.75553158],
       [0.42116679, 0.32801477]])

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))

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)

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

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

>>> a = np.array([[6, 4], [5, 9]], float)
>>> a >= 6
array([[ True, False],
       [False, True]], dtype=bool)

Slike boolean-arrays kan brukes som index:

>>> a = np.arange(10.)
>>> filt = a ** 2 > 25   # kvadrat større enn 25
>>> a[filt]
array([6., 7., 8., 9.])

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()

For mer detalj, se på numpy Quickstart – The Basics frem til «Shape Manipulation».

Større numpy/matplotlib eksempler (animation er ikke pensum)

Mer om disse eksemplene ser vi neste uke.