Matrixrekening: Matrices in Python
Basiseigenschappen en creatie van matrices
Matrices zijn in Python 2-dimensionale arrays. Net als bij vectoren gebruik je de ndarray
datastructuur voor matrices. Bij matrices kun je denken aan een opbouw van rijvectoren van gelijke lengte die onder elkaar gezet worden.
>>> import numpy as np
>>> A = np.array([[1,2,3],[4,5,6]]) # expliciete invoer van matrixelementen
>>> print(A)
[[1 2 3]
[4 5 6]]
>>> A = np.array([range(1,4),range(4,7)] # iteraties gebruikt voor de rijen in de matrix
>>> print(A)
[[1 2 3]
[4 5 6]]
>>>>> type(A)
<class 'numpy.ndarray'>
>>> A.dtype
dtype('int32')
>>> A.shape # dimensie
(2, 3)
>>> np.size(A) # aantal elementen
6
>>> len(A) # 2-dimensionale array
2
\(\phantom{x}\)
Andere veelgebruikte methoden om arrays te maken illustreren we aan de hand van voorbeelden.
Constructie van een matrix via herhalingslussen
>>> A = np.array([[i**j for j in range(1,5)] \
for i in range(1,4)])
>>> print(A)
[[ 1 1 1 1]
[ 2 4 8 16]
[ 3 9 27 81]]
Constructie van een matrix via een indexeringsfunctie
>>> def f(i,j): return i**j
>>> A = np.array([f(i,j) for i in range(1,4) \
for j in range(1,5)]).reshape(3,4)
>>> print(A)
[[ 1 1 1 1]
[ 2 4 8 16]
[ 3 9 27 81]]
Constructie van een speciale matrix Er bestaan ook speciale functies om matrices en vectoren met enen en nullen te creëren en om diagonaalmatrices te construeren, namelijk zeros
, zeros_like
, eye
, ones
en diag
:
>>> print(A)
[[ 1 1 1 1]
[ 2 4 8 16]
[ 3 9 27 81]]
>>> Z = np.zeros_like(A); print(Z)
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
>>> Z = np.zeros((2,4)); print(Z) # nulmatrix
[[0. 0. 0. 0.]
[0. 0. 0. 0.]]
>>> I = np.eye(3); print(I) # identiteitsmatrix
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
>>> J = np.ones((3,3)); print(J) # matrix met 1-en
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
>>> D = np.diag(np.array([1,2,3])); print(D) # diagonaalmatrix
[[1 0 0]
[0 2 0]
[0 0 3]]
Constructie van een matrix door stapeling Arrays kunnen ook horizontaal en verticaal gestapeld worden:
>>> np.hstack((A,I)) # horizontale stapeling van matrices array([[ 1., 1., 1., 1., 1., 0., 0.], [ 2., 4., 8., 16., 0., 1., 0.], [ 3., 9., 27., 81., 0., 0., 1.]]) >>> np.vstack((Z,A,Z)) # verticale stapeling van matrices array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 1., 1., 1., 1.], [ 2., 4., 8., 16.], [ 3., 9., 27., 81.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]])
Constructie van een willekeurige matrix Je kunt ook willekeurig gegenereerde matrices creëren:
>>> A = np.random.rand(3,2); print(A) # random 3x2 matrix met getallen tussen 0 en 1
[[0.87206119, 0.2388594],
[0.81963097, 0.4175895],
[0.67910649, 0.99048622]]
>>> random 2x3 matrix met gehele getallen in segment [5, 8]:
>>> A = np.random.randint(5, 9, size=(2, 3); print(A)
[[5 6 5]
[7 8 8]]
Constructie van een regelmatige rooster We bespreken nog twee speciale Python functies om vectoren en arrays te maken, namelijk linspace
en meshgrid
. Deze functies zullen we veel gebruiken voor het tekenen van grafieken en oppervlakken. Als je een array van \(N\) equidistante waarden uit het interval \((a,b)\) wilt maken, doe dit dan met de functieaanroep linspace(a,b,N)
:
>>> x = np.linspace(0,2,5); print(x)
[ 0. 0.5 1. 1.5 2. ]
>>> y = np.linspace(0,1,3); print(y)
[ 0. 0.5 1. ]
Deze arrays zijn te gebruiken om een 2-dimensionaal rooster te definiëren. Met de optie sparse=True
wordt zuinig met werkgeheugen omgesprongen en alleen de allernoodzakelijkste informatie van het rooster gegeven; met de optie sparse=False
worden de \(x\)- en \(y\)-coördinaten van alle roosterpunten opgeslagen. Het moge duidelijk zijn welke methode de voorkeur heeft.
>>> X, Y = np.meshgrid(x,y, sparse=True)
>>> print(X)
[[ 0. 0.5 1. 1.5 2. ]]
>>> print(Y)
[[ 0. ]
[ 0.5]
[ 1. ]]
>>> X, Y = np.meshgrid(x,y, sparse=False)
>>> print(X)
[[ 0. 0.5 1. 1.5 2. ]
[ 0. 0.5 1. 1.5 2. ]
[ 0. 0.5 1. 1.5 2. ]]
>>> print(Y)
[[ 0. 0. 0. 0. 0. ]
[ 0.5 0.5 0.5 0.5 0.5]
[ 1. 1. 1. 1. 1. ]]