NumPy: een inleiding¶

K. Verbeeck, T. Van den Bossche, J. Maervoet¶

Data Science (Theory) -- OGI03p

Werken met vectoren en matrices in standaard Python¶

In [1]:
# lijsten (van lijsten) maar veel beperkingen

vector = [5, 3.2, 6]

print(vector + vector) # geen vector-optelling
print(vector * 3) # geen vector-vermenigvuldiging

matrix = [[0, 1, 0], [1, 0, 1], [0, 1, 0]]

print(matrix) # geen pretty-print
[5, 3.2, 6, 5, 3.2, 6]
[5, 3.2, 6, 5, 3.2, 6, 5, 3.2, 6]
[[0, 1, 0], [1, 0, 1], [0, 1, 0]]
In [2]:
# wel integratie in bv matplotlib
import matplotlib.pyplot as plt
_, ax = plt.subplots()
ax.imshow(matrix)
plt.show()

De NumPy library¶

  • Performante ondersteuning voor grote multi-dimensionele arrays (matrices) en bijhorende operatoren uit de numerieke wiskunde
  • Centrale datastructuur: de n-dimensionale array ndarray
  • Quickstart

Aanmaken van NumPy arrays en basiseigenschappen¶

In [3]:
import numpy as np

# aanmaak met np.array
a = np.array([1, 2, 3])
print(a[0], '\n', type(a))
print(a)
1 
 <class 'numpy.ndarray'>
[1 2 3]
In [4]:
# basiseigenschappen
matrix = np.array([[1, 2.0], [0, 0]])
print(matrix)
print('\nndim: ', matrix.ndim)
print('\nshape: ', matrix.shape)
print('\ndtype: ', matrix.dtype) # NumPy heeft eigen datatypes
print('\nsize: ', matrix.size)

# wijzigen van de shape
matrix = np.array(range(25)).reshape(5,5)
print(matrix)
[[1. 2.]
 [0. 0.]]

ndim:  2

shape:  (2, 2)

dtype:  float64

size:  4
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]
In [5]:
# aanmaak met built-in functions

print(np.arange(0, 3, 0.25)) # standard python kan geen ranges met kommagetallen genereren
print(np.linspace(0, 2.75, 12)) # interval opgedeeld in gelijke delen
[0.   0.25 0.5  0.75 1.   1.25 1.5  1.75 2.   2.25 2.5  2.75]
[0.   0.25 0.5  0.75 1.   1.25 1.5  1.75 2.   2.25 2.5  2.75]
In [6]:
print(np.zeros([3,3]))
print(np.eye(2))
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
[[1. 0.]
 [0. 1.]]

Rekenkundige bewerkingen op element-niveau¶

In [7]:
# rekenkundige bewerkingen op element-niveau
matrix = matrix * 2
matrix = matrix + 1
print(matrix)
[[ 1  3  5  7  9]
 [11 13 15 17 19]
 [21 23 25 27 29]
 [31 33 35 37 39]
 [41 43 45 47 49]]

Indexing en slicing¶

In [8]:
# indexing en slicing - deel 1
# slicing creëert views, geen kopieën
print(matrix[1,0])
print(matrix[0, -1])
print(matrix[4]) # zelfde als [4,:]

print('\n', matrix[:2,-3:])
print('\n', matrix[::2,::2]) # step size 2
print('\n', matrix[::-1]) # negative step size
11
9
[41 43 45 47 49]

 [[ 5  7  9]
 [15 17 19]]

 [[ 1  5  9]
 [21 25 29]
 [41 45 49]]

 [[41 43 45 47 49]
 [31 33 35 37 39]
 [21 23 25 27 29]
 [11 13 15 17 19]
 [ 1  3  5  7  9]]
In [9]:
# indexing en slicing - deel 2
# index arrays
test = np.array([10, 9, 8, 7])
print(test[ np.array([0, 0, 1, 1]) ])
[10 10  9  9]
In [10]:
# indexing en slicing - deel 3
# boolean "mask" index arrays

masker = (matrix > 25)
print(masker)

matrix[masker] = 0
print(matrix)
[[False False False False False]
 [False False False False False]
 [False False False  True  True]
 [ True  True  True  True  True]
 [ True  True  True  True  True]]
[[ 1  3  5  7  9]
 [11 13 15 17 19]
 [21 23 25  0  0]
 [ 0  0  0  0  0]
 [ 0  0  0  0  0]]

Operatoren¶

In [11]:
# basisoperatoren

d = np.ones(3) + np.eye(3) # som op element-niveau
print(d)

e = np.full((3,3), 5)
print(e)
print(d*e) # produkt op element-niveau (!)
print(d@e) # dot-produkt (!) = d.dot(e)
[[2. 1. 1.]
 [1. 2. 1.]
 [1. 1. 2.]]
[[5 5 5]
 [5 5 5]
 [5 5 5]]
[[10.  5.  5.]
 [ 5. 10.  5.]
 [ 5.  5. 10.]]
[[20. 20. 20.]
 [20. 20. 20.]
 [20. 20. 20.]]
In [12]:
a = np.array([[1,2,3],[4,5,6]])
print(a.T) # getransponeerde
[[1 4]
 [2 5]
 [3 6]]
In [13]:
# universal functions

scores = np.array([[14.5, 7, 9], [12, 18, 11.5], [3, 14, 15]])
print(np.mean(scores))
print(np.mean(scores, axis = 0))
print(np.average(scores, axis = 1, weights = [0.3, 0.2, 0.5]))
11.555555555555555
[ 9.83333333 13.         11.83333333]
[10.25 12.95 11.2 ]

Zijn ndarrays lijsten?¶

  • Nee, ze zijn van het type iterable net zoals lijsten
  • Het zijn eerder grote objecten die hun brondata zo efficiënt mogelijk beheren
    • Sommige operaties (eenvoudige indexing en slicing) geven views terug en geen copies
  • Omdat ze iterable zijn werken ze goed samen met libraries zoals matplotlib
In [14]:
import matplotlib.pyplot as plt

x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
plt.plot(x, y)
plt.show()

Must-reads¶

  • Quickstart
  • Linear algebra

image.png