Ga naar hoofdinhoud

Scipy-tutorial: vectoren en arrays (lineaire algebra)

Een SciPy-tutorial waarin je de basis van lineaire algebra leert die je nodig hebt voor machine learning in Python, met focus op hoe-je-dat-doet met NumPy.
Bijgewerkt 2 okt 2026  · 15 min lezen

Verken met AI

ChatGPTClaudePerplexity

Veel van wat je moet weten om echt in machine learning te duiken, is lineaire algebra, en precies dat pakt deze tutorial aan. In dit artikel behandelen we de onderwerpen uit de lineaire algebra die je moet kennen en begrijpen om je intuïtie te verbeteren voor hoe en wanneer machine learning-methoden werken, door te kijken op het niveau van vectoren en matrices.

Aan het einde van de tutorial voel je je hopelijk zekerder om een algoritme van dichterbij te bekijken!

Inhoud


Introductie

Een van de drie basisonderwerpen die je moet beheersen als je data science wilt leren, is machine learning. En wanneer je echt in machine learning duikt, is het belangrijk om dieper te gaan en een intuïtie en begrip te ontwikkelen van hoe de algoritmen werken.

En ik denk dat jij, (aspirant-)data scientist, het waarschijnlijk met me eens bent dat het best een klus kan zijn om dit punt te bereiken.

Maar dat hoeft niet zo te zijn.

SciPy versus NumPy

Uit DataCamp’s NumPy-tutorial heb je al begrepen dat deze bibliotheek een van de kernbibliotheken is voor wetenschappelijk rekenen in Python. Deze bibliotheek bevat een verzameling tools en technieken die je kunt gebruiken om op een computer wiskundige modellen van problemen in wetenschap en techniek op te lossen. Maar de tool die je het vaakst zult gebruiken is een high-performance multidimensionaal array-object: het is een krachtige datastructuur die je in staat stelt om efficiënt arrays en matrices te berekenen.

Nu is SciPy in wezen NumPy.

Het is ook een van de kernpakketten voor wetenschappelijk rekenen die wiskundige algoritmen en handige functies biedt, maar het is gebouwd op de NumPy-extensie van Python. Dat betekent dat SciPy en NumPy vaak samen worden gebruikt!

Later in deze tutorial zal het je duidelijk worden hoe de samenwerking tussen deze twee bibliotheken vanzelfsprekend is geworden.

Interactie met NumPy en SciPy

Om efficiënt met beide pakketten te werken, moet je eerst wat basiskennis hebben van deze bibliotheek en zijn krachtige datastructuur. Om met deze arrays te werken, is er een enorme hoeveelheid high-level wiskundige functies die op deze matrices en arrays werken.

In wat volgt krijg je een snel overzicht van de onderwerpen die je onder de knie moet hebben om efficiënt met SciPy te werken. In essentie moet je de array-structuur kennen en weten hoe je met datatypes kunt omgaan en hoe je de vorm van arrays kunt manipuleren. Klinkt dit je vreemd in de oren, overweeg dan DataCamp’s Python NumPy Tutorial te volgen en vergeet tijdens het leren niet om ook even de NumPy-cheat sheet te bekijken.

Als je dit allemaal al weet, sla dan de volgende sectie over en ga naar “Lineaire algebra met SciPy”, maar houd je SciPy-cheat sheet voor lineaire algebra bij de hand!

data science-cursussen banner

De basis van NumPy ndarray-objecten

Een array is, structureel gezien, niets meer dan pointers. Het is een combinatie van een geheugenadres, een datatype, een vorm en strides. Het bevat informatie over de ruwe data, hoe je een element lokaliseert en hoe je een element interpreteert.

Het geheugenadres en de strides zijn belangrijk wanneer je dieper ingaat op de low-level details van arrays, terwijl het datatype en de vorm dingen zijn die beginners zeker moeten kennen en begrijpen. Twee andere attributen die je kunt overwegen zijn data en size, waarmee je nog meer informatie over je array kunt verzamelen.

Fris het gebruik van de ndarray-attributen op in de volgende DataCamp Light-chunk. De array myArray is al ingeladen. Je kunt hem inspecteren door hem in te typen in de IPython-shell en op ENTER te drukken.

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5teUFycmF5ID0gbnAuYXJyYXkoW1sxLDIsM10sWzQsNSw2XV0pIiwic2FtcGxlIjoiIyBJbnNwZWN0IHRoZSBkYXRhIG9mIGBteUFycmF5YFxucHJpbnQobXlBcnJheS5kYXRhKVxuXG4jIEluc3BlY3QgdGhlIGRhdGEgdHlwZSBvZiBgbXlBcnJheWBcbnByaW50KF9fX19fX19fX19fX19fX19fKVxuXG4jIEluc3BlY3QgdGhlIHNoYXBlIG9mIGBteUFycmF5YFxucHJpbnQoX19fX19fX19fX19fX19fX19fKVxuXG4jIEluc3BlY3QgdGhlIHNpemUgb2YgYG15QXJyYXlgXG5wcmludChfX19fX19fX19fX19fX19fX18pIiwic29sdXRpb24iOiIjIEluc3BlY3QgdGhlIGRhdGEgb2YgYG15QXJyYXlgXG5wcmludChteUFycmF5LmRhdGEpXG5cbiMgSW5zcGVjdCB0aGUgZGF0YSB0eXBlIG9mIGBteUFycmF5YFxucHJpbnQobXlBcnJheS5kdHlwZSlcblxuIyBJbnNwZWN0IHRoZSBzaGFwZSBvZiBgbXlBcnJheWBcbnByaW50KG15QXJyYXkuc2hhcGUpXG5cbiMgSW5zcGVjdCB0aGUgc2l6ZSBvZiBgbXlBcnJheWBcbnByaW50KG15QXJyYXkuc2l6ZSkiLCJzY3QiOiJ0ZXN0X2Z1bmN0aW9uKFxuICAgIFwicHJpbnRcIixcbiAgICAxLFxuICAgIG5vdF9jYWxsZWRfbXNnPVwiRGlkIHlvdSBwcmludCBvdXQgYG15QXJyYXkuZGF0YWA/XCIsXG4gICAgaW5jb3JyZWN0X21zZz1cIkRvbid0IGZvcmdldCB0byBwcmludCBvdXQgdGhlIGRhdGEgb2YgYG15QXJyYXlgIVwiLFxuICAgIGRvX2V2YWw9RmFsc2VcbilcbnRlc3RfZnVuY3Rpb24oXG4gICAgXCJwcmludFwiLFxuICAgIDIsXG4gICAgbm90X2NhbGxlZF9tc2c9XCJEaWQgeW91IHByaW50IG91dCBgbXlBcnJheS5kdHlwZWA/XCIsXG4gICAgaW5jb3JyZWN0X21zZz1cIkRvbid0IGZvcmdldCB0byBwcmludCBvdXQgdGhlIGRhdGEgdHlwZSBvZiBgbXlBcnJheWAhXCIsXG4gICAgZG9fZXZhbD1GYWxzZVxuKVxudGVzdF9mdW5jdGlvbihcbiAgICBcInByaW50XCIsXG4gICAgMyxcbiAgICBub3RfY2FsbGVkX21zZz1cIkRpZCB5b3UgcHJpbnQgb3V0IGBteUFycmF5LnNoYXBlYD9cIixcbiAgICBpbmNvcnJlY3RfbXNnPVwiRG9uJ3QgZm9yZ2V0IHRvIHByaW50IG91dCB0aGUgc2hhcGUgb2YgYG15QXJyYXlgIVwiLFxuICAgIGRvX2V2YWw9RmFsc2VcbilcbnRlc3RfZnVuY3Rpb24oXG4gICAgXCJwcmludFwiLFxuICAgIDQsXG4gICAgbm90X2NhbGxlZF9tc2c9XCJEaWQgeW91IHByaW50IG91dXQgdGhlIGBteUFycmF5LnNpemVgP1wiLFxuICAgIGluY29ycmVjdF9tc2c9XCJEb24ndCBmb3JnZXQgdG8gcHJpbnQgb3V0IHRoZSBzaXplIG9mIGBteUFycmF5YCFcIixcbiAgICBkb19ldmFsPUZhbHNlXG4pXG5zdWNjZXNzX21zZyhcIldlbGwgZG9uZSFcIikifQ==

Je ziet in de resultaten van de code in de chunk hierboven dat het datatype van myArray int64 is. Als je intensief met arrays werkt, zul je zeker onthouden dat er manieren zijn om je arrays van het ene datatype naar het andere te converteren met de astype()-methode.

Toch zul je, wanneer je SciPy en NumPy samen gebruikt, de volgende NumPy-functies voor typehandling ook erg nuttig vinden, zeker als je met complexe getallen werkt:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5teUFycmF5ID0gbnAuYXJyYXkoW1sxKzVqLDIsMys2al0sWzQrMWosNSw2KzJqXV0pIiwic2FtcGxlIjoiIyBSZXR1cm4gdGhlIHJlYWwgcGFydCBvZiBgbXlBcnJheWAgZWxlbWVudHNcbm5wLnJlYWwobXlBcnJheSlcblxuIyBSZXR1cm4gdGhlIGltYWdpbmFyeSBwYXJ0IG9mIGBteUFycmF5YCBlbGVtZW50c1xubnAuaW1hZyhteUFycmF5KVxuXG4jIFJldHVybiBhIHJlYWwgYXJyYXkgaWYgdGhlIGNvbXBsZXggcGFydHMgYXJlIGNsb3NlIHRvIDBcbm5wLnJlYWxfaWZfY2xvc2UobXlBcnJheSx0b2w9MTAwMClcblxuIyBDYXN0IGBteUFycmF5YCB0byBmbG9hdFxubnAuY2FzdFsnZiddKG15QXJyYXkpIn0=

Probeer print()-aanroepen toe te voegen om de resultaten van de bovenstaande code te zien. Dan zie je dat complexe getallen een reëel en een imaginair deel hebben. De functies np.real() en np.imag() zijn respectievelijk ontworpen om deze delen terug te geven.

Daarnaast kun je ook np.cast gebruiken om een array-object naar een ander datatype te casten, zoals float in het voorbeeld hierboven.

Het enige dat qua moeilijkheidsgraad echt opvalt in de bovenstaande codechunk is de functie np.real_if_close(). Wanneer je een complex invoer geeft, zoals myArray, krijg je een reële array terug als de complexe delen dicht bij nul liggen. Dit laatste, “dicht bij 0”, kun je zelf aanpassen met het argument tol dat je aan de functie kunt meegeven. Speel met de drempel om te zien wat er gebeurt!

Arrays maken

Je hebt nu gezien hoe je je array kunt inspecteren en het datatype ervan kunt aanpassen, maar je hebt nog niet expliciet gezien hoe je arrays maakt. Je weet waarschijnlijk al dat je np.array() kunt gebruiken om dit te doen, maar er zijn andere routines voor het maken van arrays die je moet kennen: np.eye() en np.identity().

Met de functie np.eye() maak je een vierkante matrix met dimensies die gelijk zijn aan het positieve geheel getal dat je als argument meegeeft. De elementen worden doorgaans gevuld met nullen, alleen de hoofddiagonaal wordt gevuld met enen. De functie np.identity() werkt hetzelfde en geeft ook een identiteitarray terug.

Let op dat np.eye() een extra argument k kan aannemen waarmee je de index van de diagonaal kunt kiezen die je met enen wilt vullen.

Andere functies om arrays te maken die enorm van pas komen wanneer je met matrices voor lineaire algebra werkt, zijn de volgende:

  • De functie np.arange() maakt een array met gelijkmatig verdeelde waarden tussen twee getallen. Je kunt de stapgrootte tussen de elementen opgeven,
  • Dat geldt ook voor np.linspace(), maar met deze functie specificeer je het aantal elementen dat je in je array wilt.
  • Tot slot maakt de functie np.logspace() ook arrays met gelijkmatig verdeelde waarden, maar dan op een logaritmische schaal. Dat betekent dat de spreiding nu logaritmisch is: twee getallen zijn gelijkmatig verdeeld tussen de logaritmen van deze twee op basis 10.

Deze functies maken arrays in de vorm van rasters, die je kunt gebruiken om meshgrids te maken, waarover je eerder in dit artikel las.

Let op dat numpy al is geïmporteerd als np in de codechunk hieronder!

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wIiwic2FtcGxlIjoiIyBDcmVhdGUgYSAyWDIgaWRlbnRpdHkgbWF0cml4IHdpdGggYG5wLmV5ZSgpYFxuX19fX19fX19fX19fX19fX19fXG5cbiMgQ3JlYXRlIGEgM1gzIGlkZW50aXR5IG1hdHJpeCB3aXRoIGBucC5pZGVudGl0eSgpYFxuX19fX19fX19fX19fX19fX19fXG5cbiMgVW5pZm9ybWx5IHNwYWNlZCB2YWx1ZXM6IHNwYWNpbmdcbl9fX19fX19fXygzLCA3LCAyKVxuXG4jIFVuaWZvcm1seSBzcGFjZWQgdmFsdWVzOiBudW1iZXIgb2Ygc2FtcGxlc1xuX19fX19fX19fX18oMiwgMywgNSlcblxuIyBVbmlmb3JtbHkgc3BhY2VkIHZhbHVlczogbG9nYXJpdGhtaWMgc3BhY2luZyBcbl9fX19fX19fX19fKDIsIDMsIDQpIiwic29sdXRpb24iOiIjIENyZWF0ZSBhIDJYMiBpZGVudGl0eSBtYXRyaXggd2l0aCBgbnAuZXllKClgXG5ucC5leWUoMilcblxuIyBDcmVhdGUgYSAzWDMgaWRlbnRpdHkgbWF0cml4IHdpdGggYG5wLmlkZW50aXR5KClgXG5ucC5pZGVudGl0eSgzKVxuXG4jIFVuaWZvcm1seSBzcGFjZWQgdmFsdWVzOiBzcGFjaW5nXG5ucC5hcmFuZ2UoMywgNywgMilcblxuIyBVbmlmb3JtbHkgc3BhY2VkIHZhbHVlczogbnVtYmVyIG9mIHNhbXBsZXNcbm5wLmxpbnNwYWNlKDIsIDMsIDUpXG5cbiMgVW5pZm9ybWx5IHNwYWNlZCB2YWx1ZXM6IGxvZ2FyaXRobWljIHNwYWNpbmcgXG5ucC5sb2dzcGFjZSgyLCAzLCA0KSIsInNjdCI6InRlc3RfZnVuY3Rpb24oXCJudW1weS5leWVcIiwgYXJncz1bMF0sIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IHVzZSBgbnAuZXllKClgIHRvIGNyZWF0ZSBhIDJ4MiBpZGVudGl0eSBtYXRyaXg/XCIpXG50ZXN0X2Z1bmN0aW9uKFwibnVtcHkuaWRlbnRpdHlcIiwgYXJncz1bMF0sIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IHVzZSBgbnAuaWRlbnRpdHkoKWAgdG8gY3JlYXRlIGEgM3gzIGlkZW50aXR5IG1hdHJpeD9cIilcbnRlc3RfZnVuY3Rpb24oXCJudW1weS5hcmFuZ2VcIilcbnRlc3RfZnVuY3Rpb24oXCJudW1weS5saW5zcGFjZVwiKVxudGVzdF9mdW5jdGlvbihcIm51bXB5LmxvZ3NwYWNlXCIpXG5zdWNjZXNzX21zZyhcIkdyZWF0IGpvYiFcIikifQ==

Nu je je geheugen hebt opgefrist en weet hoe je met de datatypes van je arrays omgaat, is het tijd om ook indexing en slicing aan te pakken.

Indexeren en slicen

Met indexeren gebruik je eigenlijk vierkante haken [] om de array-waarden te indexeren. Met andere woorden, je kunt indexeren gebruiken als je toegang wilt tot geselecteerde elementen — een subset — van een array. Je data slicen lijkt sterk op subsetting, maar je kunt het zien als net iets geavanceerder. Wanneer je een array slicet, kijk je niet alleen naar specifieke waarden, maar werk je met “regio’s” van data in plaats van pure “locaties”.

Fris beide concepten op met de volgende codevoorbeelden:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5teUFycmF5ID0gbnAuYXJyYXkoWzEsMiwzLDRdKVxubXlfMmRBcnJheSA9IG5wLmFycmF5KFtbMSwyLDMsNF0sIFs1LDYsNyw4XV0sIGR0eXBlPW5wLmludDY0KVxubXlfM2RBcnJheSA9IG5wLmFycmF5KFtbWzEsMiwzLDRdLCBbNSw2LDcsOF1dLCBbWzEsMiwzLDRdLCBbOSwxMCwxMSwxMl1dXSwgZHR5cGU9bnAuaW50NjQpIiwic2FtcGxlIjoiIyBTbGljZSBgbXlBcnJheWAgYXQgaW5kZXggMCBhbmQgMVxucHJpbnQoX19fX19fX19fX19fKVxuXG4jIFNsaWNlIGBteV8yZEFycmF5YCBhdCByb3cgMCBhbmQgMSwgY29sdW1uIDFcbnByaW50KF9fX19fX19fX19fX19fX18pXG5cbiMgU2xpY2UgYG15XzNkQXJyYXlgIGF0IHJvdyAxXG5wcmludChteV8zZEFycmF5WzEsLi4uXSlcblxuIyBCb29sZWFuIGluZGV4aW5nOiBvbmx5IHZhbHVlcyA8IDJcbnByaW50KG15QXJyYXlbX19fX19fX19fX19fXSlcblxuIyBGYW5jeSBpbmRleGluZ1xucHJpbnQobXlfMmRBcnJheVtbMSwgMCwgMSwgMF0sWzAsIDEsIDIsIDBdXSkiLCJzb2x1dGlvbiI6IiMgU2xpY2UgYG15QXJyYXlgIGF0IGluZGV4IDAgYW5kIDFcbnByaW50KG15QXJyYXlbMDoyXSlcblxuIyBTbGljZSBgbXlfMmRBcnJheWAgYXQgcm93IDAgYW5kIDEsIGNvbHVtbiAxXG5wcmludChteV8yZEFycmF5WzA6MiwxXSlcblxuIyBTbGljZSBgbXlfM2RBcnJheWAgYXQgcm93IDFcbnByaW50KG15XzNkQXJyYXlbMSwuLi5dKVxuXG4jIEJvb2xlYW4gaW5kZXhpbmc6IG9ubHkgdmFsdWVzIDwgMlxucHJpbnQobXlBcnJheVtteUFycmF5PDJdKVxuXG4jIEZhbmN5IGluZGV4aW5nXG5wcmludChteV8yZEFycmF5W1sxLCAwLCAxLCAwXSxbMCwgMSwgMiwgMF1dKSIsInNjdCI6InRlc3RfZnVuY3Rpb24oXG4gICAgXCJwcmludFwiLFxuICAgIDEsXG4gICAgbm90X2NhbGxlZF9tc2c9XCJEaWQgeW91IHByaW50IG91dXQgYG15QXJyYXlbMDoyXWApXCIsXG4gICAgaW5jb3JyZWN0X21zZz1cIkRvbid0IGZvcmdldCB0byBzbGljZSBgbXlBcnJheWAgYXQgaW5kZXggMCBhbmQgMSEgXCIsXG4gICAgZG9fZXZhbD1GYWxzZVxuKVxudGVzdF9mdW5jdGlvbihcbiAgICBcInByaW50XCIsXG4gICAgMixcbiAgICBub3RfY2FsbGVkX21zZz1cIkRpZCB5b3UgcHJpbnQgb3V0IGBteV8yZEFycmF5WzA6MiwxXWAgP1wiLFxuICAgIGluY29ycmVjdF9tc2c9XCJEb24ndCBmb3JnZXQgdG8gc2xpY2UgYG15XzJkQXJyYXlgIGF0IGluZGV4IDAgZW4gMSwgkolcIixcbiAgICBkb19ldmFsPUZhbHNlXG4pXG50ZXN0X2Z1bmN0aW9uKFxuICAgIFwicHJpbnRcIixcbiAgICAzLFxuICAgIG5vdF9jYWxsZWRfbXNnPVwiRGlkIHlvdSBwcmludCBvdXQgYG15XzNkQXJyYXlbMSwuLi5dYD9cIixcbiAgICBpbmNvcnJlY3RfbXNnPVwiRG9uJ3QgZm9yZ2V0IHRvIHNsaWNlIGBteV8zZEFycmF5YCBhdCByaWogMVwiLFxuICAgIGRvX2V2YWw9RmFsc2VcbilcbnRlc3RfZnVuY3Rpb24oXG4gICAgXCJwcmludFwiLFxuICAgIDQsXG4gICAgbm90X2NhbGxlZF9tc2c9XCJEaWQgeW91IHByaW50IG91dXQgYG15QXJyYXldbXlBcnJheTwxXV1gP1wiLFxuICAgIGluY29ycmVjdF9tc2c9XCJEb24ndCBmb3JnZXQgdG8gYWRkIHRoZSBjb25kaXRpb24gYG15QXJyYXk8MmAgdG8gYG15QXJyYXlgIVwiLFxuICAgIGRvX2V2YWw9RmFsc2VcbilcbnRlc3RfZnVuY3Rpb24oXG4gICAgXCJwcmludFwiLFxuICAgIDUsXG4gICAgbm90X2NhbGxlZF9tc2c9XCJEaWQgeW91IHByaW50IG91dCBgbXlfMmRBcnJheVtbMSwgMCwgMSwgMF0sWzAsIDEsIDIsIDBdXVwgP1wiLFxuICAgIGRvX2V2YWw9RmFsc2VcbilcbnN1Y2Nlc3NfbXNnKFwiWWF5ISBZb3UncmUgYW4gZXhwZXJ0IGluIGluZGV4aW5nIGFuZCBzbGljaW5nIHdpdGggTnVtUHkhXCIpIn0=

Nu je hoofd weer fris is met slicen en indexeren, ben je misschien ook geïnteresseerd in wat indextrucjes die je werk efficiënter kunnen maken wanneer je met SciPy aan wetenschappelijk rekenen doet. Er zijn vier functies die zeker terugkomen, namelijk np.mgrid(), np.ogrid(), np.r en np.c.

De laatste twee functies ken je misschien al als je ervaring hebt met NumPy. np.r en np.c worden vaak gebruikt wanneer je arrays respectievelijk rij- of kolomsgewijs wilt stapelen. Met deze functies kun je snel arrays construeren in plaats van de functie np.concatenate() te gebruiken.

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5hcnJheSA9IG5wLmV5ZSgyKVxubXlfMmRBcnJheSA9IG5wLmFycmF5KFtbMSwyLDMsNF0sIFs1LDYsNyw4XV0sIGR0eXBlPW5wLmludDY0KSIsInNhbXBsZSI6IiMgQ3JlYXRlIGEgZGVuc2UgbWVzaGdyaWRcbm5wLm1ncmlkWzE6MTE6MiwgLTEyOi0zOjNdXG5cbiMgQ3JlYXRlIGFuIG9wZW4gbWVzaGdyaWRcbm5wLm9ncmlkWzE6MTE6MiwgLTEyOi0zOjNdXG5cbiMgU3RhY2sgYXJyYXlzIHZlcnRpY2FsbHlcbm5wLnJfWzMsWzBdKjUsLTE6MToxMGpdXG5cbiMgU3RhY2sgYXJyYXlzIGhvcml6b250YWxseSBcbm5wLmNfW2FycmF5LCBteV8yZEFycmF5XSJ9

Als je naar de eerste twee van deze vier functies kijkt, vraag je je misschien af waarom je een meshgrid nodig hebt. Je kunt meshgrids gebruiken om twee arrays te genereren die de x- en y-coördinaten op elke positie in een rechthoekig raster bevatten. De functie np.meshgrid() neemt twee 1D-arrays en produceert twee 2D-matrices die overeenkomen met alle paren (x, y) in de twee arrays.

  • De functie np.mgrid() is een implementatie van MATLAB’s meshgrid en geeft arrays terug met dezelfde vorm. Dat betekent dat de dimensies en het aantal uitvoer­arrays gelijk zijn aan het aantal indexeerdimensies.
  • De functie np.ogrid() daarentegen geeft een open meshgrid en is niet zo dicht als het resultaat dat np.mgrid() oplevert. Je ziet het visuele verschil tussen de twee in de codechunk hierboven.

Je kunt ook hier meer lezen over de verschillen tussen deze twee functies.

Een andere functie die je kunt gebruiken voor indexeer/slice-doeleinden is np.select(). Je kunt hiermee waarden teruggeven uit een lijst van arrays, afhankelijk van voorwaarden die je zelf specificeert in het eerste argument van de functie. In het tweede argument geef je de array mee die je voor dit selectieproces wilt overwegen.

Bekijk het volgende voorbeeld:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wIiwic2FtcGxlIjoiIyBJbml0aWFsaXplIGEgMkQgYXJyYXkgXG5teV8yZEFycmF5ID0gbnAuYXJyYXkoW1sxLDIsMyw0XSwgWzUsNiw3LDhdXSwgZHR5cGU9bnAuaW50NjQpXG5cbiMgU2VsZWN0IHZhbHVlcyBmcm9tIGBteV8yZEFycmF5YFxubnAuc2VsZWN0KFtteV8yZEFycmF5IDwgNF0sW215XzJkQXJyYXkgKiAyXSkifQ==

Top! Nu je de juiste waarden uit je oorspronkelijke array hebt geselecteerd, kun je nog steeds de vorm selecteren en je nieuwe array manipuleren.

Vorm selecteren en manipuleren

NumPy biedt veel manieren om de vorm van je arrays te selecteren en te manipuleren, en veel daarvan ken je waarschijnlijk al. De volgende sectie geeft alleen een kort overzicht van functies die van pas kunnen komen, dus we behandelen ze niet allemaal.

Bestaan er functies die handig zijn wanneer je met SciPy werkt?

De meest nuttige zijn die waarmee je arrays kunt flattenen, stapelen en splitsen. Je hebt de functies np.c en np.r al gezien, die je vaak verkiest boven np.concatenate(), maar er zijn er nog veel meer die je wilt kennen!

Zoals np.hstack() om je arrays horizontaal te stapelen of np.vstack() om je arrays verticaal te stapelen. Op vergelijkbare wijze kun je np.vsplit() en np.hsplit() gebruiken om je arrays verticaal en horizontaal te splitsen. Maar dit wist je waarschijnlijk al.

Bewijs het in de volgende codechunk:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5teUFycmF5ID0gbnAuYXJyYXkoWzEsMiwzLDRdKVxubXlfMmRBcnJheSA9IG5wLmFycmF5KFtbMSwyLDMsNF0sIFs1LDYsNyw4XV0sIGR0eXBlPW5wLmludDY0KVxubXlfM2RBcnJheSA9IG5wLmFycmF5KFtbWzEsMiwzLDRdLCBbNSw2LDcsOF1dLCBbWzEsMiwzLDRdLCBbOSwxMCwxMSwxMl1dXSwgZHR5cGU9bnAuaW50NjQpIiwic2FtcGxlIjoiI1N0YWNrIGFycmF5cyBob3Jpem9udGFsbHkgKGNvbHVtbi13aXNlKVxucHJpbnQoX19fX19fX19fKChucC5leWUoMiksIG15XzJkQXJyYXkpKSlcblxuIyBTdGFjayBhcnJheXMgdmVydGljYWxseSAocm93LXdpc2UpXG5wcmludChfX19fX19fX19fKChteUFycmF5LCBteV8yZEFycmF5KSkpXG5cbiMgU3BsaXQgdGhlIGFycmF5IGhvcml6b250YWxseSBhdCB0aGUgMm5kIGluZGV4XG5wcmludChfX19fX19fX19fXyhteV8yZEFycmF5LCAyKSlcblxuIyBTcGxpdCB0aGUgYXJyYXkgdmVydGljYWxseSBhdCB0aGUgMm5kIGluZGV4XG5wcmludChfX19fX19fX19fX18obXlfMmRBcnJheSwgMikpIiwic29sdXRpb24iOiIjU3RhY2sgYXJyYXlzIGhvcml6b250YWxseSAoY29sdW1uLXdpc2UpXG5wcmludChucC5oc3RhY2soKG5wLmV5ZSgyKSwgbXlfMmRBcnJheSkpKVxuXG4jIFN0YWNrIGFycmF5cyB2ZXJ0aWNhbGx5IChyb3ctd2lzZSlcbnByaW50KG5wLnZzdGFjaygobXlBcnJheSwgbXlfMmRBcnJheSkpKVxuXG4jIFNwbGl0IHRoZSBhcnJheSBob3Jpem9udGFsbHkgYXQgdGhlIDJuZCBpbmRleFxucHJpbnQobnAuaHNwbGl0KG15XzJkQXJyYXksIDIpKVxuXG4jIFNwbGl0IHRoZSBhcnJheSB2ZXJ0aWNhbGx5IGF0IHRoZSAybmQgaW5kZXhcbnByaW50KG5wLnZzcGxpdChteV8yZEFycmF5LCAyKSkiLCJzY3QiOiJ0ZXN0X2Z1bmN0aW9uKFxuICAgIFwicHJpbnRcIixcbiAgICAxLFxuICAgIG5vdF9jYWxsZWRfbXNnPVwiRGlkIHlvdSBwcmludCBvdXQgYG5wLmhzdGFjaygobnAuZXllKDIpLCBteV8yZEFycmF5KSlgP1wiLFxuICAgIGluY29ycmVjdF9tc2c9XCJEb24ndCBmb3JnZXQgdG8gc3RhY2sgYG5wLmV5ZSgyKWAgYW5kIGBteV8yZEFycmF5YCBob3Jpem9udGFsbHkhXCIsXG4gICAgZG9fZXZhbD1GYWxzZVxuKVxudGVzdF9mdW5jdGlvbihcbiAgICBcInByaW50XCIsXG4gICAgMixcbiAgICBub3RfY2FsbGVkX21zZz1cIkRpZCB5b3UgcHJpbnQgb3V0IGBucC52c3RhY2sobXlBcnJheSwgbXlfMmRBcnJheSkpYD9cIixcbiAgICBpbmNvcnJlY3RfbXNnPVwiRG9uJ3QgZm9yZ2V0IHRvIHN0YWNrIGBteUFycmF5YCBhbmQgYG15XzJkQXJyYXlgIHZlcnRpY2FsbHkhXCIsXG4gICAgZG9fZXZhbD1GYWxzZVxuKVxudGVzdF9mdW5jdGlvbihcbiAgICBcInByaW50XCIsXG4gICAgMyxcbiAgICBub3RfY2FsbGVkX21zZz1cIkRpZCB5b3UgcHJpbnQgb3V0IGBucC5oc3BsaXQobXlfMmRBcnJheSwgMilgP1wiLFxuICAgIGluY29ycmVjdF9tc2c9XCJEb24ndCBmb3JnZXQgdG8gaG9yaXpvbnRhbGx5IHNwbGl0IGBteV8yZEFycmF5YCBhdCB0aGUgMm5kIGluZGV4IVwiLFxuICAgIGRvX2V2YWw9RmFsc2VcbilcbnRlc3RfZnVuY3Rpb24oXG4gICAgXCJwcmludFwiLFxuICAgIDQsXG4gICAgbm90X2NhbGxlZF9tc2c9XCJEaWQgeW91IHByaW50IG91dCBgbnAudnNwbGl0KG15XzJkQXJyYXksIDIpYD9cIixcbiAgICBpbmNvcnJlY3RfbXNnPVwiRG9uJ3QgZm9yZ2V0IHRvIHZlcnRpY2FsbHkgc3BsaXQgYG15XzJkQXJyYXlgIGF0IGluZGV4IDIhXCIsXG4gICAgZG9fZXZhbD1GYWxzZVxuKVxuc3VjY2Vzc19tc2coXCJZb3UncmUgYSB0cnVlIG1hc3RlciBpbiBzdGFja2luZyBhbmQgc3BsaXR0aW5nIGFycmF5cyFcIikifQ==

Onthoud dat de functie np.eye() een 2x2-identiteitarray maakt, die perfect is om te stapelen met de 2D-array die in de bovenstaande codechunk voor je is ingeladen.

Wil je meer weten over de voorwaarden waarmee je rekening moet houden als je arrays wilt stapelen, ga dan hierheen. Je kunt echter ook gewoon naar de arrays en de functies kijken om gevoel te krijgen voor welke ‘regels’ je moet respecteren als je de twee arrays per rij of per kolom wilt samenvoegen.

Het belangrijkste waarmee je rekening moet houden bij het splitsen van arrays, is waarschijnlijk de vorm van je array, omdat je de juiste index wilt selecteren waarop de splitsing moet plaatsvinden.

Naast functies om arrays te stapelen en te splitsen, is het ook goed om te onthouden dat functies die helpen om te garanderen dat je met arrays van een bepaalde dimensie werkt, onmisbaar zijn wanneer je dieper in wetenschappelijk rekenen duikt.

Overweeg de volgende functies:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5teUFycmF5ID0gbnAuYXJyYXkoWzEsMiwzLDRdKVxubXlfMmRBcnJheSA9IG5wLmFycmF5KFtbMSwyLDMsNF0sIFs1LDYsNyw4XV0sIGR0eXBlPW5wLmludDY0KVxubXlfM2RBcnJheSA9IG5wLmFycmF5KFtbWzEsMiwzLDRdLCBbNSw2LDcsOF1dLCBbWzEsMiwzLDRdLCBbOSwxMCwxMSwxMl1dXSwgZHR5cGU9bnAuaW50NjQpIiwic2FtcGxlIjoiI1Blcm11dGUgYG15QXJyYXlgIGRpbWVuc2lvbnNcbnByaW50KG5wLnRyYW5zcG9zZShteUFycmF5KSlcblxuIyBGbGF0dGVuIGBteV8zZEFycmF5YFxucHJpbnQobXlfM2RBcnJheS5mbGF0dGVuKCkpXG5cbiMgUmVzaGFwZSBidXQgZG9uJ3QgY2hhbmdlIHRoZSBkYXRhXG5wcmludChteV8yZEFycmF5LnJlc2hhcGUoNCwyKSlcblxuIyBSZXNpemUgdG8gKDYsNClcbnByaW50KG5wLnJlc2l6ZShteV8zZEFycmF5LCAoNiw0KSkpIn0=

Let op het verschil tussen reshapen en resizen van je array. Met het eerste verander je de vorm van de data, maar niet de data zelf. Bij resizen is het mogelijk dat de data in de array verandert, afhankelijk van de vorm die je kiest, natuurlijk.

Naast de routines voor splitsen en stapelen en de functies waarmee je je arrays verder kunt manipuleren, is er ook zoiets als “vectorisatie” om rekening mee te houden. Wanneer je een functie op een array toepast, pas je die meestal toe op elk element van de array. Overweeg bijvoorbeeld om np.cos(), np.sin() of np.tan() toe te passen op een array. Je ziet dat dit op alle array-elementen werkt. Als je dit ziet, weet je dat de functie gevectoriseerd is.

Maar wanneer je zelf functies definieert, zoals je waarschijnlijk zult doen als je met wetenschappelijk rekenen bezig bent, wil je ze misschien ook vectoriseren. In die gevallen kun je np.vectorize() aanroepen:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5teUFycmF5ID0gbnAuYXJyYXkoWzEsMiwzLDRdKSIsInNhbXBsZSI6IiMgRGVmaW5lIGEgZnVuY3Rpb24gYG15ZnVuY2BcbmRlZiBteWZ1bmMoYSxiKTpcbiAgaWYgYSA+IGI6XG4gICAgIHJldHVybiBhIC0gYlxuICBlbHNlOlxuICAgICByZXR1cm4gYSArIGJcbiAgICBcbiMgVmVjdG9yaXplIGBteWZ1bmNgXG52ZWN0b3JpemVkRnVuYyA9IG5wLnZlY3Rvcml6ZShteWZ1bmMpIFxuXG4jIEFwcGx5IFxudmVjdG9yaXplZEZ1bmMobXlBcnJheSwgMikifQ==

Als het gaat om andere gevectoriseerde wiskundige functies die je wilt kennen, overweeg dan np.angle() om de hoek te geven van de elementen van complexe arrays, maar ook basisfuncties uit de goniometrie, exponentiële of logaritmische functies komen van pas.

Leer Python voor Data Science met DataCamp

Lineaire algebra met SciPy

Nu je weet wat je nodig hebt om beide pakketten in je voordeel te gebruiken, is het tijd om in het onderwerp van deze tutorial te duiken: lineaire algebra.

Maar voordat je kijkt hoe je Python kunt gebruiken, zorg je ervoor dat je werk­omgeving helemaal klaar is!

SciPy installeren

Natuurlijk moet je eerst zeker weten dat je Python hebt geïnstalleerd. Ga naar deze pagina als je dat nog moet doen :) Als je op Windows werkt, zorg er dan voor dat je Python hebt toegevoegd aan de PATH-omgevingsvariabele. Vergeet daarnaast niet een package manager te installeren, zoals pip, zodat je de open-sourcebibliotheken van Python kunt gebruiken.

Let op dat recente versies van Python 3 met pip worden geleverd, dus controleer of je het hebt en werk het bij voordat je andere packages installeert:

 pip install pip --upgrade pip --version

Maar alleen een package manager installeren is niet genoeg; Je moet ook het wheel voor de bibliotheek downloaden: ga hierheen om je SciPy-wheel te halen. Open na het downloaden de terminal in de downloadmap op je pc en installeer het. Je kunt bovendien controleren of de installatie is geslaagd en de pakketversie bevestigen die je gebruikt:

# Install the wheel install "scipy‑0.18.1‑cp36‑cp36m‑win_amd64.whl"# Confirm successful installimport scipy# Check package versionscipy.__version__

Na deze stappen ben je klaar om te ga(a)n!

Tip: installeer het pakket door de Anaconda Python-distributie te downloaden. Dat is een makkelijke manier om snel te starten, want Anaconda bevat niet alleen 100 van de populairste Python-, R- en Scala-packages voor data science, maar ook meerdere open ontwikkelomgevingen zoals Jupyter en Spyder. Wil je met Jupyter Notebook beginnen, bekijk dan deze Jupyter Notebook-tutorial.

Als je het nog niet hebt gedownload, ga dan hierheen om het te halen.

Vectoren en matrices: de basis

Nu je zeker weet dat je werk­omgeving klaarstaat, kun je eindelijk aan de slag met lineaire algebra in Python. In essentie houdt deze discipline zich bezig met de studie van vectorruimten en de lineaire afbeeldingen die daartussen bestaan. Deze lineaire afbeeldingen kun je beschrijven met matrices, wat het berekenen ook eenvoudiger maakt.

Onthoud dat een vectorruimte een fundamenteel concept is in lineaire algebra. Het is een ruimte waar je een verzameling objecten (vectoren) hebt en waar je twee vectoren kunt optellen of schalen zonder dat de resulterende vector de ruimte verlaat. Onthoud ook dat vectoren rijen (of kolommen) van een matrix zijn.

Maar hoe werkt dit in Python?

Je maakt eenvoudig een vector met de functie np.array(). Evenzo kun je elke één- of tweedimensionale ndarray een matrixstructuur geven met de commando’s np.matrix() of np.mat().

Probeer het in de volgende codechunk:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wIiwic2FtcGxlIjoiIyBDcmVhdGUgYSB2ZWN0b3Jcbm15VmVjdG9yID0gbnAuYXJyYXkoWzEsMiwzLDRdKVxuXG4jIENyZWF0ZSBhIG1hdHJpeFxubXlNYXRyaXggPSBucC5tYXRyaXgobnAucmFuZG9tLnJhbmRvbSgoNSw1KSkpIn0=

Dus arrays en matrices zijn hetzelfde, afgezien van de opmaak?

Niet helemaal. Er zijn enkele verschillen:

  • Een matrix is 2D, terwijl arrays doorgaans n-dimensionaal zijn,
  • Zoals de functies hierboven al suggereerden, is de matrix een subklasse van ndarray,
  • Zowel arrays als matrices hebben .T(), maar alleen matrices hebben .H() en .I(),
  • Matrixvermenigvuldiging werkt anders dan elementgewijze arrayvermenigvuldiging, en
  • Daarnaast levert de **-bewerking verschillende resultaten op voor matrices en arrays

Als je met matrices werkt, heb je soms matrices waarin de meeste elementen nul zijn. Deze matrices noem je “spaarzame matrices” (sparse), terwijl die met vooral niet-nul elementen “dichte matrices” (dense) worden genoemd.

Op zich lijkt dit triviaal, maar als je SciPy gebruikt voor lineaire algebra kan dit verschil soms uitmaken voor de modules die je gebruikt om dingen gedaan te krijgen. Concreet kun je scipy.linalg gebruiken voor dichte matrices, maar wanneer je met spaarzame matrices werkt, kun je ook de module scipy.sparse overwegen, die ook een eigen scipy.sparse.linalg bevat.

Voor spaarzame matrices zijn er behoorlijk wat opties om ze te maken. De onderstaande codechunk somt er een paar op:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5mcm9tIHNjaXB5IGltcG9ydCBzcGFyc2UgXG5DID0gbnAucmFuZG9tLnJhbmRvbSgoMTAsNSkpXG5DW0MgPiAwLjVdID0gMCAiLCJzYW1wbGUiOiIjIENyZWF0ZSBhIDJYMiBpZGVudGl0eSBtYXRyaXhcbm5wLmV5ZSgzLCBrPTEpICAgICAgICBcblxuIyBDcmVhdGUgYSAyeDIgaWRlbnRpdHkgbWF0cml4XG5ucC5tYXQobnAuaWRlbnRpdHkoMikpICAgICAgICAgXG5cbiMgQ29tcHJlc3NlZCBTcGFyc2UgUm93IG1hdHJpeFxuc3BhcnNlLmNzcl9tYXRyaXgoQykgIFxuXG4jIENvbXByZXNzZWQgU3BhcnNlIENvbHVtbiBtYXRyaXhcbnNwYXJzZS5jc2NfbWF0cml4KEMpICBcblxuIyBEaWN0aW9uYXJ5IE9mIEtleXMgbWF0cml4XG5zcGFyc2UuZG9rX21hdHJpeChDKSAgIn0=

Daarnaast zijn er ook andere functies die je kunt gebruiken om spaarzame matrices te maken: Block Sparse Row-matrices met bsr_matrix(), COOrdinate-format spaarzame matrices met coo_matrix(), DIAgonaal-opslag spaarzame matrices met dia_matrix(), en rijgebaseerde linked-list spaarzame matrices met lil_matrix().

Er zijn echt veel opties, maar welke kies je als je zelf een spaarzame matrix maakt?

Zo moeilijk is het niet.

Het komt er in de basis op neer hoe je hem gaat initialiseren. Bedenk daarna wat je met je spaarzame matrix wilt doen.

Concreter kun je de volgende checklist doorlopen om te beslissen welk type spaarzame matrix je wilt gebruiken:

  • Als je van plan bent de matrix element voor element te vullen, kies dan coo_matrix() of dok_matrix() om je matrix te maken.
  • Als je de matrix wilt initialiseren met een array als diagonaal, kies dan dia_matrix() om je matrix te initialiseren.
  • Voor slice-gebaseerde matrices gebruik je lil_matrix().
  • Als je de matrix opbouwt uit blokken van kleinere matrices, overweeg dan bsr_matrix().
  • Als je snelle toegang tot je rijen en kolommen wilt, converteer je matrices dan met respectievelijk de functies csr_matrix() en csc_matrix(). De laatste twee zijn niet ideaal om mee te initialiseren, maar bij vermenigvuldigen merk je zeker het snelheidsverschil.

Appeltje-eitje!

Vectorbewerkingen

Nu je het verschil tussen vectoren, dichte matrices en spaarzame matrices hebt geleerd of opgefrist, is het tijd om dichter naar vectoren te kijken en welke wiskundige bewerkingen je ermee kunt doen. De tutorial focust hier expliciet op wiskundige bewerkingen zodat je de overeenkomsten en verschillen met matrices gaat zien, en omdat een groot deel van lineaire algebra uiteindelijk met matrices werken is.

Je hebt al gezien dat je eenvoudig een vector kunt maken met np.array(). Maar nu je vectoren tot je beschikking hebt, wil je misschien ook wat basisbewerkingen kennen die je erop kunt uitvoeren. vector1 en vector2 zijn al voor je ingeladen in de volgende codechunk:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG52ZWN0b3IxPW5wLmFycmF5KFsxLDIsM10pXG52ZWN0b3IyID0gbnAuYXJyYXkoWzIsMyw0XSkiLCJzYW1wbGUiOiIjIEFkZGl0aW9uIG9mIGB2ZWN0b3IxYCBhbmQgYHZlY3RvcjJgXG52ZWN0b3IzID0gdmVjdG9yMSArIHZlY3RvcjJcblxuIyBQcmludCBgdmVjdG9yM2BcbnByaW50KF9fX19fX18pXG5cbiMgU3VidHJhY3Rpb24gb2YgYHZlY3RvcjJgIGFuZCBgdmVjdG9yMWBcbnZlY3RvcjQgPSBfX19fX19fXyAtIHZlY3RvcjFcblxuIyBwcmludCBgdmVjdG9yNGBcbnByaW50KHZlY3RvcjQpXG5cbiMgRG90IHByb2R1Y3Qgb2YgYHZlY3RvcjFgIGFuZCBgdmVjdG9yMmBcbmRvdFByb2R1Y3QgPSBucC5kb3QodmVjdG9yMSwgdmVjdG9yMilcblxuIyBQcmludCBgZG90UHJvZHVjdGBcbnByaW50KGRvdFByb2R1Y3QpXG5cbiMgQ3Jvc3MgcHJvZHVjdCBvZiBgdmVjdG9yMWAgYW5kIGB2ZWN0b3IyYFxuY3Jvc3NQcm9kdWN0ID0gbnAuY3Jvc3MoX19fX19fX18sIHZlY3RvcjIpXG5cbiMgUHJpbnQgYGNyb3NzUHJvZHVjdGBcbnByaW50KF9fX19fX19fX19fXykiLCJzb2x1dGlvbiI6IiMgQWRkaXRpb24gb2YgYHZlY3RvcjFgIGFuZCBgdmVjdG9yMmBcbnZlY3RvcjMgPSB2ZWN0b3IxICsgdmVjdG9yMlxuXG4jIFByaW50IGB2ZWN0b3IzYCBvZiBgdmVjdG9yMmAgYW5kIGB2ZWN0b3IxYFxucHJpbnQodmVjdG9yMylcblxuIyBTdWJ0cmFjdGlvblxudmVjdG9yNCAgPSB2ZWN0b3IyIC0gdmVjdG9yMVxuXG4jIHByaW50IGB2ZWN0b3I0YFxucHJpbnQodmVjdG9yNClcblxuIyBEb3QgcHJvZHVjdCBvZiBgdmVjdG9yMWAgYW5kIGB2ZWN0b3IyYFxuZG90UHJvZHVjdCA9IG5wLmRvdCh2ZWN0b3IxLCB2ZWN0b3IyKVxuXG4jIFByaW50IGBkb3RQcm9kdWN0YFxucHJpbnQoZG90UHJvZHVjdClcblxuIyBDcm9zcyBwcm9kdWN0IG9mIGB2ZWN0b3IxYCBhbmQgYHZlY3RvcjJgXG5jcm9zc1Byb2R1Y3QgPSBucC5jcm9zcyh2ZWN0b3IxLCB2ZWN0b3IyKVxuXG4jIFByaW50IGBjcm9zc1Byb2R1Y3RgXG5wcmludChjcm9zc1Byb2R1Y3QpIiwic2N0IjoidGVzdF9vYmplY3QoXCJ2ZWN0b3IzXCIpXG50ZXN0X2Z1bmN0aW9uKFwicHJpbnRcIiwgaW5kZXg9MSlcbnRlc3Rfb2JqZWN0KFwidmVjdG9yNFwiKVxudGVzdF9mdW5jdGlvbihcInByaW50XCIsIGluZGV4PTIpXG50ZXN0X29iamVjdChcImRvdFByb2R1Y3RcIilcbnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCBpbmRleD0zKVxudGVzdF9vYmplY3QoXCJjcm9zc1Byb2R1Y3RcIilcbnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCBpbmRleD00KVxuc3VjY2Vzc19tc2coXCJXZWxsIGRvbmUhXCIpIn0=

Nu je enkele vectorbewerkingen hebt gezien, is het tijd om met het echte matrixwerk te beginnen!

Matrices: bewerkingen en routines

Net als aan het begin van de vorige sectie weet je hoe je matrices maakt, maar je weet nog niet hoe je ze in je voordeel kunt gebruiken. Deze sectie geeft je een overzicht van enkele matrixfuncties en basisroutines waarmee je efficiënt kunt werken.

Laten we eerst een aantal functies doornemen. Deze zullen vrij gemakkelijk zijn als je eerder met NumPy hebt gewerkt, maar zelfs als je nog geen ervaring hebt, zul je zien dat deze functies eenvoudig te gebruiken zijn.

We bekijken een paar voorbeelden van functies.

Er zijn np.add() en np.subtract() om arrays of matrices op te tellen en af te trekken, en ook np.divide() en np.multiply voor deling en vermenigvuldiging. Dit lijkt niet echt een groot mysterie, toch? Ook de functie np.dot() die je in de vorige sectie hebt gezien, waar hij werd gebruikt om het inproduct te berekenen, kan ook met matrices worden gebruikt. Vergeet alleen niet om twee matrices door te geven in plaats van vectoren.

Dat is basic, toch?

Laten we iets minder basic gaan. Als het om vermenigvuldigingen gaat, zijn er nog andere functies die je kunt overwegen, zoals np.vdot() voor het inproduct van vectoren, np.inner() of np.outer() voor de binnen- of buitenproducten van arrays, np.tensordot() en np.kron() voor het Kronecker-product van twee arrays:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5tYXRyaXgxID0gbnAubWF0cml4KG5wLnJhbmRvbS5yYW5kb20oKDIsMikpKVxubWF0cml4MiA9IG5wLm1hdChbWzMsNF0sIFs1LDZdXSlcbnZlY3RvcjE9bnAuYXJyYXkoWzEsMiwzXSlcbnZlY3RvcjIgPSBucC5hcnJheShbMiwzLDRdKSIsInNhbXBsZSI6IiMgVmVjdG9yIGRvdCBwcm9kdWN0XG52ZWN0b3JEb3RQcm9kdWN0ID0gbnAudmRvdCh2ZWN0b3IxLCB2ZWN0b3IyKVxuXG4jIElubmVyIHByb2R1Y3RcbmlubmVyUHJvZHVjdCA9IG5wLmlubmVyKHZlY3RvcjEsIHZlY3RvcjIpXG5cbiMgT3V0ZXIgcHJvZHVjdFxub3V0ZXJQcm9kdWN0ID0gbnAub3V0ZXIodmVjdG9yMSwgdmVjdG9yMilcblxuIyBUZW5zb3IgZG90IHByb2R1Y3RcbnRlbnNvckRvdFByb2R1Y3QgPSBucC50ZW5zb3Jkb3QobWF0cml4MSwgbWF0cml4MilcblxuIyBLcm9uZWNrZXIgcHJvZHVjdFxua3JvblByb2R1Y3QgPSBucC5rcm9uKG1hdHJpeDEsIG1hdHJpeDIpIn0=

Tip: voeg print-statements toe aan de codechunk hierboven om de afzonderlijke productresultaten te zien.

Naast deze kan het ook nuttig zijn om enkele functies uit de module linalg te overwegen: de matrixexponentiële functies linalg.expm(), linalg.expm2() en linalg.expm3(). Het verschil tussen deze drie zit in de manieren waarop de exponent wordt berekend. Houd je voor een algemene matrixexponentiële aan de eerste, maar probeer ze zeker alledrie om het verschil in resultaten te zien!

Ook goniometrische functies zoals linalg.cosm(), linalg.sinm() en linalg.tanm(), hyperbolische goniometrische functies zoals linalg.coshm(), linalg.sinhm() en linalg.tanhm(), de tekenfunctie linalg.signm(), het matrixlogaritme linalg.logm() en de matriceswortel linalg.sqrtm().

Daarnaast kun je ook een matrixfunctie evalueren met behulp van de functie linalg.funm(). Bekijk het onderstaande voorbeeld:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiZnJvbSBzY2lweSBpbXBvcnQgbGluYWxnXG5pbXBvcnQgbnVtcHkgYXMgbnAgXG5teU1hdHJpeCA9IG5wLm1hdHJpeChucC5yYW5kb20ucmFuZG9tKCg1LDUpKSkiLCJzYW1wbGUiOiJsaW5hbGcuZnVubShteU1hdHJpeCwgbGFtYmRhIHg6IHgqeCkifQ==

Je ziet dat je als eerste argument de matrix meegeeft waarop je een functie wilt toepassen en als tweede een functie (in dit geval een lambda-functie) die je op de matrix toepast. Let op dat de functie die je doorgeeft aan linalg.funm() gevectoriseerd moet zijn.

Laten we nu kijken naar enkele basisroutines voor matrices. Het eerste wat je waarschijnlijk wilt bekijken, zijn de matrixattributen: T voor transponeren, H voor geconjugeerd transponeren, I voor inverse, en A om naar een array te casten.

Probeer ze uit:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wIFxubXlNYXRyaXggPSBucC5tYXRyaXgobnAucmFuZG9tLnJhbmRvbSgoNSw1KSkpIiwic2FtcGxlIjoiIyBUcmFuc3Bvc2l0aW9uXG5teU1hdHJpeC5fXG5cbiMgQ29uanVnYXRlIHRyYW5zcG9zaXRpb25cbm15TWF0cml4Ll9cblxuIyBJbnZlcnNlXG5teU1hdHJpeC5fXG5cbiMgQXJyYXlcbm15TWF0cml4Ll8iLCJzb2x1dGlvbiI6IiMgVHJhbnNwb3NpdGlvblxubXlNYXRyaXguVFxuXG4jIENvbmp1Z2F0ZSB0cmFuc3Bvc2l0aW9uXG5teU1hdHJpeC5IXG5cbiMgSW52ZXJzZVxubXlNYXRyaXguSVxuXG4jIEFycmF5XG5teU1hdHJpeC5BIiwic2N0IjoidGVzdF9vYmplY3RfYWNjZXNzZWQoXCJteU1hdHJpeC5UXCIpXG50ZXN0X29iamVjdF9hY2Nlc3NlZChcIm15TWF0cml4LkhcIilcbnRlc3Rfb2JqZWN0X2FjY2Vzc2VkKFwibXlNYXRyaXguSVwiKVxudGVzdF9vYmplY3RfYWNjZXNzZWQoXCJteU1hdHJpeC5BXCIpXG5zdWNjZXNzX21zZyhcIkF3ZXNvbWUhXCIpIn0=

Wanneer je een matrix transponeert, maak je een nieuwe matrix waarvan de rijen de kolommen van de oorspronkelijke zijn. Een geconjugeerde transpositie verwisselt daarentegen de rij- en kolomindex voor elk matrixelement. De inverse van een matrix is een matrix die, vermenigvuldigd met de oorspronkelijke matrix, resulteert in een identiteitmatrix.

Maar naast die attributen zijn er ook echte functies die je kunt gebruiken om enkele basisroutines op matrices uit te voeren, zoals np.transpose() en linalg.inv() voor respectievelijk transponeren en de inverse.

Daarnaast kun je met np.trace() de spoorsom of som van de elementen op de hoofddiagonaal van de matrix ophalen. Evenzo kun je met linalg.matrix_rank uit NumPy de matrixrang bepalen, of het aantal Singular Value Decomposition-singuliere waarden van een array die groter zijn dan een bepaalde drempel.

Maak je geen zorgen als de matrixrang nu nog niet logisch lijkt; Later in deze tutorial zie je hier meer over.

Voor nu focussen we op nog twee routines die je kunt gebruiken:

  • De norm van een matrix kun je berekenen met linalg.norm: een matrixnorm is een getal dat is gedefinieerd op basis van de elementen van de matrix. De norm is een nuttige grootheid die belangrijke informatie over een matrix kan geven, omdat deze aangeeft hoe groot de elementen zijn.
  • Daarbovenop kun je ook de determinant berekenen — een nuttige waarde die kan worden berekend uit de elementen van een vierkante matrix — met linalg.det(). De determinant reduceert een vierkante matrix tot één getal, dat bepaalt of de vierkante matrix inverteerbaar is of niet.

Ten slotte is het oplossen van grote stelsels lineaire vergelijkingen een van de meest basale toepassingen van matrices. Als je een stelsel hebt van \(Ax = b\), waarbij \(A\) een vierkante matrix is en \(b\) een algemene matrix, heb je twee methoden die je kunt gebruiken om \(x\) te vinden, afhankelijk natuurlijk van het type matrix waarmee je werkt:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5mcm9tIHNjaXB5IGltcG9ydCBsaW5hbGdcbkEgPSBucC5tYXRyaXgobnAucmFuZG9tLnJhbmRvbSgoMiwyKSkpXG5hID0gbnAuYXJyYXkoWzEsMiwzXSlcbkUgPSBucC5tYXQoYSkuVFxuYiA9IG5wLmFycmF5KFsoMSs1aiwyaiwzaiksICg0aiw1aiw2aildKVxuRiA9IG5wLmV5ZSgzLCBrPTEpIiwic2FtcGxlIjoiIyBEZW5zZSBtYXRyaXggc29sdmVyXG5saW5hbGcuc29sdmUoQSwgYilcblxuIyBMaW5lYXIgbGVhc3Qtc3F1YXJlIHNvbHZlclxubGluYWxnLmxzdHNxKEYsRSkifQ==

Voor spaarzame matrices kun je linalg.spsolve() gebruiken. Als je de vergelijking niet kunt oplossen, is het mogelijk om met de opdracht linalg.lstsq() alsnog een benaderende \(x\) te verkrijgen.

Tip: mis DataCamp’s SciPy-cheat sheet niet.

Nu je een idee hebt hoe je matrices maakt en hoe je ze gebruikt voor wiskundige bewerkingen, is het tijd om wat geavanceerdere onderwerpen aan te pakken die je nodig hebt om echt met machine learning aan de slag te gaan.

Eigenwaarden en eigenvectoren

Het eerste onderwerp dat je aanpakt, zijn de eigenwaarden en eigenvectoren.

Eigenwaarden zijn een nieuwe manier om in het hart van een matrix te kijken. Maar voordat we daarop ingaan, leggen we eerst uit wat eigenvectoren zijn. Bijna alle vectoren veranderen van richting wanneer ze met een matrix worden vermenigvuldigd. Bepaalde uitzonderlijke resulterende vectoren hebben echter dezelfde richting als de vectoren die het resultaat zijn van de vermenigvuldiging. Dit zijn de eigenvectoren.

Met andere woorden, vermenigvuldig een eigenvector met een matrix, en de resulterende vector van die vermenigvuldiging is gelijk aan een vermenigvuldiging van de oorspronkelijke eigenvector met \(\lambda\), de eigenwaarde: \[Ax = \lambda x. \]

Dit betekent dat de eigenwaarde je zeer waardevolle informatie geeft: ze vertelt of een van de eigenvectoren wordt uitgerekt, gekrompen, omgekeerd of onveranderd blijft — wanneer hij met een matrix wordt vermenigvuldigd.

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5pbXBvcnQgc2NpcHlcbmZyb20gc2NpcHkgaW1wb3J0IGxpbmFsZyBcbm15TWF0cml4ID0gbnAubWF0cml4KG5wLnJhbmRvbS5yYW5kb20oKDIsMikpKSIsInNhbXBsZSI6IiMgU29sdmUgZWlnZW52YWx1ZSBwcm9ibGVtXG5sYSwgdiA9IGxpbmFsZy5laWcobXlNYXRyaXgpIFxuXG4jIFVucGFjayBlaWdlbnZhbHVlc1xubDEsIGwyID0gbGFcblxuIyBGaXJzdCBlaWdlbnZlY3Rvclxudls6LDBdXG5cbiMgU2Vjb25kIGVpZ2VudmVjdG9yXG52WzosMV1cblxuIyBPciB1bnBhY2sgZWlnZW52YWx1ZXMgd2l0aCBgZWlndmFscygpYFxubGluYWxnLmVpZ3ZhbHMobXlNYXRyaXgpIn0=

Je gebruikt de functie eig() uit de SciPy-module linalg om gewone of gegeneraliseerde eigenwaardeproblemen voor vierkante matrices op te lossen.

Let op dat de functie eigvals() een andere manier is om de eigenwaarden van een matrix uit te pakken.

Wanneer je met spaarzame matrices werkt, kun je terugvallen op de module scipy.sparse die de juiste functies biedt om eigenwaarden en eigenvectoren te vinden:

la, v = sparse.linalg.eigs(myMatrix,1)

Let op dat de code hierboven het aantal op te halen eigenwaarden en eigenvectoren specificeert, namelijk 1.

De eigenwaarden en eigenvectoren zijn belangrijke concepten in veel computer vision- en machine learning-technieken, zoals Principal Component Analysis (PCA) voor dimensionality reduction en EigenFaces voor gezichtsherkenning.

Singular Value Decomposition (SVD)

Vervolgens moet je SVD kennen als je echt data science wilt leren. De singular value decomposition van een matrix \(A\) is de ontbinding of factorisatie van \(A\) in het product van drie matrices: \(A = U * \Sigma * V^t\).

De grootte van de afzonderlijke matrices is als volgt als je weet dat matrix \(A\) van grootte \(M\) x \(N\) is:

  • Matrix \(U\) is van grootte \(M\) x \(M\)
  • Matrix \(V\) is van grootte \(N\) x \(N\)
  • Matrix \(\Sigma\) is van grootte \(M\) x \(N\)

De \(*\) geeft aan dat de matrices worden vermenigvuldigd en de \(^t\) die je in \(V^t\) ziet, betekent dat de matrix is getransponeerd, wat inhoudt dat rijen en kolommen zijn verwisseld.

Eenvoudig gezegd biedt singular value decomposition een manier om een matrix op te delen in eenvoudigere, betekenisvolle stukken. Deze stukken kunnen data bevatten waarin we geïnteresseerd zijn.

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiaW1wb3J0IG51bXB5IGFzIG5wXG5mcm9tIHNjaXB5IGltcG9ydCBsaW5hbGdcbmIgPSBucC5hcnJheShbKDErNWosMmosM2opLCAoNGosNWosNmopXSlcbm15TWF0cml4ID0gbnAuYXNtYXRyaXgoYikiLCJzYW1wbGUiOiIjIFNpbmd1bGFyIFZhbHVlIERlY29tcG9zaXRpb25cblUscyxWaCA9IGxpbmFsZy5zdmQobXlNYXRyaXgpIFxuXG4jIEluaXRpYWxpemUgYE1gIGFuZCBgTmBcbk0sTiA9IG15TWF0cml4LnNoYXBlXG5cbiMgQ29uc3RydWN0IHNpZ21hIG1hdHJpeCBpbiBTVkRcblNpZyA9IGxpbmFsZy5kaWFnc3ZkKHMsTSxOKSJ9

Let op dat je voor spaarzame matrices de functie sparse.linalg.svds() kunt gebruiken om de decompositie uit te voeren.

Als je nieuw bent in data science, zal de matrixdecompositie vrij ondoorzichtig voor je zijn: je ziet misschien niet meteen toepassingen. Maar SVD is nuttig bij veel taken, zoals datacompressie, ruisreductie en data-analyse. Hieronder zie je hoe SVD kan worden gebruikt om afbeeldingen te comprimeren:

# Import the necessary packagesimport numpy as npfrom scipy import linalgfrom skimage import dataimport matplotlib.pyplot as plt# Get an image from `skimage`img= data.camera()# Check number of singular valueslinalg.svdvals(img)# Singular Value DecompositionU, s, Vh = linalg.svd(img)# Use only 32 singular valuesA = np.dot(U[:,0:32],           np.dot(np.diag(s[0:32]), Vh[0:32,:]))fig = plt.figure(figsize=(8, 3))# Add a subplot to the figureax = fig.add_subplot(121)# Plot `img` on grayscaleax.imshow(img, cmap='gray')# Add a second subplot to the figureax2 = fig.add_subplot(122)# Plot `A` in the second subplotax2.imshow(A)# Add a titlefig.suptitle('Image Compression with SVD', fontsize=14, fontweight='bold')# Show the plotplt.show()

Dit levert je het volgende resultaat op:


afbeeldingscompressie met svd

Bekijk ook de volgende voorbeelden waar SVD wordt gebruikt:

  • SVD is nauw verbonden met Principal Component Analysis (PCA), dat wordt gebruikt voor dimensionality reduction: beide resulteren in een set “nieuwe assen” die zijn geconstrueerd uit lineaire combinaties van de assen van je feature space. Deze “nieuwe assen” splitsen de variantie in de datapunten op, gebaseerd op de bijdrage van elke richting aan de variantie in de data. Voor een concreet voorbeeld van hoe PCA op data werkt, ga naar onze Scikit-Learn-tutorial.
  • Een andere link is die met data mining en natural language processing (NLP): Latent Semantic Indexing (LSI). Dat is een techniek die wordt gebruikt bij documentopvraag en woordgelijkenis. Latente semantische indexering gebruikt SVD om documenten te groeperen bij de concepten die kunnen bestaan uit verschillende woorden die in die documenten worden gevonden. Diverse woorden kunnen worden gegroepeerd tot een concept. Ook hier reduceert SVD de ruisachtige correlatie tussen woorden en hun documenten, en verlaagt het het aantal dimensies dat de oorspronkelijke data heeft.

Je ziet, SVD is een belangrijk concept in je data science-reis dat je moet behandelen. Daarom is het de moeite waard om dieper in SVD te duiken dan wat deze tutorial behandelt: ga bijvoorbeeld naar deze pagina om meer te lezen over deze matrixdecompositie.

Wat staat er nu op het programma?

Je bent tot het einde van de tutorial gekomen! Waar je vanaf hier naartoe gaat, is helemaal aan jou.

Maar wacht even!

Mis geen cursussen die dieper op lineaire algebra ingaan: deze tutorial was slechts een introductie tot het onderwerp en heeft niet alles behandeld!

Overweeg natuurlijk ook DataCamp’s Machine Learning-tutorial te volgen, die zeker waarde toevoegt aan je leertraject nadat je deze Scipy-tutorial over lineaire algebra hebt doorgenomen. Maar als je terug wilt naar de basis, bekijk dan onze NumPy-tutorial of de cursus Intermediate Python for Data Science.

Onderwerpen
Python
Data Science
Data-analyse

Leer meer over Python

Cursus

Python voor gemiddeld niveau

4 uur
1.4M
Maak je data science skills sterker: creëer visualisaties met Matplotlib en bewerk DataFrames met pandas.
Bekijk detailsRight Arrow
Start Cursus
Meer bekijkenRight Arrow
Gerelateerd

blog

AI vanaf nul leren in 2026: een complete gids van de experts

Ontdek alles wat je moet weten om in 2026 AI te leren, van tips om te beginnen tot handige resources en inzichten van industrie-experts.
Adel Nehme's photo

Adel Nehme

15 min

Meer BekijkenMeer Bekijken