Sitelet https://www.datacamp.com/nl/tutorial/python-numpy-tutorial
Ga naar hoofdinhoud

Python Numpy Array Tutorial

Een NumPy-tutorial voor beginners waarin je leert hoe je een NumPy-array maakt, broadcasting gebruikt, waarden opvraagt, arrays manipuleert en veel meer.
Bijgewerkt 2 okt 2026  · 15 min lezen

Verken met AI

ChatGPTClaudePerplexity

NumPy is, net als SciPy, Scikit-Learn, pandas en vergelijkbare pakketten. Het zijn de Python-pakketten die je gewoon niet kunt missen als je data science leert, vooral omdat deze bibliotheek je een array-datastructuur biedt die voordelen heeft ten opzichte van Python-lijsten, zoals compacter zijn, sneller lezen en schrijven, handiger en efficiënter.

Deze NumPy richt zich daar precies op. Het laat je niet alleen zien wat NumPy-arrays eigenlijk zijn en hoe je Python kunt installeren, maar je leert ook hoe je arrays maakt (zelfs wanneer je data uit bestanden komt), hoe broadcasting werkt, hoe je om hulp kunt vragen, hoe je je arrays manipuleert en hoe je ze visualiseert.

Als je nog meer wilt weten over NumPy-arrays en de andere datastructuren die je nodig hebt in je data science-reis, overweeg dan om te kijken naar DataCamp’s Intro to Python for Data Science, waarin een hoofdstuk over NumPy staat.

Wat is een Python Numpy-array?

Je hebt in de introductie al gelezen dat NumPy-arrays een beetje lijken op Python-lijsten, maar tegelijkertijd ook erg verschillend zijn. Voor wie nieuw is met het onderwerp, laten we verduidelijken wat het precies is en waar het goed voor is.

Zoals de naam al verraadt, is een NumPy-array een centrale datastructuur van de numpy-bibliotheek. De naam van de bibliotheek is een afkorting van “Numeric Python” of “Numerical Python”.

Met andere woorden, NumPy is een Python-bibliotheek die de kern is voor wetenschappelijk rekenen in Python. Het bevat een verzameling tools en technieken die kunnen worden gebruikt om wiskundige modellen van problemen in wetenschap en techniek op te lossen.

Een van deze tools is een krachtige, high-performance multidimensionale array die een krachtige datastructuur biedt voor efficiënte berekeningen op arrays en matrices. Om met deze arrays te werken, is er een grote hoeveelheid hoog-niveau wiskundige functies die op deze matrices en arrays opereren.

Maar wat is een array?

Als je naar de print van een paar arrays kijkt, kun je het zien als een raster met waarden van hetzelfde type:

import numpy as np
# Define a 1D array
my_array = np.array([[1, 2, 3, 4],
                     [5, 6, 7, 8]],
                    dtype=np.int64)
# Define a 2D array
my_2d_array = np.array([[1, 2, 3, 4],
                        [5, 6, 7, 8]],
                       dtype=np.int64)
# Define a 3D array
my_3d_array = np.array([[[1, 2, 3, 4],
                         [5, 6, 7, 8]],
                        [[1, 2, 3, 4],
                         [9, 10, 11, 12]]],
                       dtype=np.int64)
# Print the 1D array
print("Printing my_array:")
print(my_array)
# Print the 2D array
print("Printing my_2d_array:")
print(my_2d_array)
# Print the 3D array
print("Printing my_3d_array:")
print(my_3d_array)

Je ziet dat in het bovenstaande voorbeeld de data integers zijn. De array bevat en representeert reguliere data op een gestructureerde manier.

Je moet echter weten dat een array op structureel niveau in feite niet meer is dan pointers. Het is een combinatie van een geheugenadres, een datatyp, een shape en strides:

  • De datapointer geeft het geheugenadres aan van de eerste byte in de array.
  • De dtype- of datatyppointer beschrijft het soort elementen dat in de array zit.
  • De shape geeft de vorm van de array aan.
  • De strides zijn het aantal bytes dat moet worden overgeslagen in het geheugen om naar het volgende element te gaan. Als je strides (10,1) zijn, moet je één byte verder om naar de volgende kolom te gaan en 10 bytes om de volgende rij te vinden.

Met andere woorden, een array bevat informatie over de ruwe data, hoe je een element lokaliseert en hoe je een element interpreteert.

Genoeg theorie. Laten we dit zelf bekijken:

Je kunt dit eenvoudig testen door de numpy-arrayattributen te verkennen:

import numpy as np
my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Print out memory address
print(my_2d_array.data)

# Print out the shape of `my_array`
print(my_2d_array.shape)

# Print out the data type of `my_array`
print(my_2d_array.dtype)

# Print out the stride of `my_array`
print(my_2d_array.strides)

Je ziet dat je nu veel meer informatie krijgt: bijvoorbeeld, het datatype dat geprint wordt is ‘int64’ of signed 32-bit integer type; Dit is veel gedetailleerder! Dat betekent ook dat de array in het geheugen is opgeslagen als 64 bytes (omdat elke integer 8 bytes inneemt en je een array van 8 integers hebt). De strides van de array vertellen ons dat je 8 bytes (één waarde) moet overslaan om naar de volgende kolom te gaan, maar 32 bytes (4 waarden) om naar dezelfde positie in de volgende rij te gaan. Als zodanig zijn de strides voor de array (32,8).

Let op dat als je het datatype op int32 zet, de strides-tuple die je terugkrijgt (16, 4) zal zijn, omdat je nog steeds één waarde opschuift naar de volgende kolom en 4 waarden om dezelfde positie te krijgen. Het enige dat verandert is dat elke integer 4 bytes inneemt in plaats van 8

Numpy Array Axis

De array die je hierboven ziet is, zoals de naam al suggereert, een 2-dimensionale array: je hebt rijen en kolommen. De rijen worden aangeduid als “as 0”, terwijl de kolommen “as 1” zijn. Het nummer van de as loopt op met het aantal dimensies: in 3D-arrays, waarvan je ook een voorbeeld zag in de vorige code, heb je een extra “as 2”. Let op dat deze assen alleen geldig zijn voor arrays met minstens 2 dimensies, omdat dit geen zin heeft voor 1D-arrays;

Deze assen komen later van pas wanneer je de vorm van je NumPy-arrays manipuleert.

Hoe installeer je Numpy

Voordat je zelf met deze NumPy-arrays aan de slag kunt, moet je eerst zeker weten dat je het lokaal hebt geïnstalleerd (ervan uitgaande dat je op je pc werkt). Als je de Python-bibliotheek al beschikbaar hebt, sla deze sectie dan gerust over :)

Als je je omgeving nog moet inrichten, moet je weten dat er twee belangrijke manieren zijn om NumPy op je pc te installeren: met behulp van Python wheels of de Anaconda Python-distributie.

Installeren met Python Wheels

Zorg er eerst voor dat je Python hebt geïnstalleerd. Je kunt onze gids bekijken over hoe je Python installeert als je dit nog moet doen :)

Als je op Windows werkt, zorg er dan voor dat je Python hebt toegevoegd aan de PATH-omgevingsvariabele. Vergeet vervolgens niet een pakketbeheerder te installeren, zoals pip, zodat je de open-sourcebibliotheken van Python kunt gebruiken.

Let op dat recente versies van Python 3 met pip komen, dus controleer dubbel of je het hebt, en als dat zo is, upgrade het dan voordat je NumPy installeert:

pip install pip --upgrade
pip --version
Download het juiste NumPy wheel-bestand voor je systeem van de PyPI-website. Je vindt de lijst met beschikbare NumPy-wheels op de Python Package Index.
 
Zodra je het NumPy wheel-bestand hebt gedownload, navigeer je naar de map waar het bestand is opgeslagen via de opdrachtprompt of terminal.
 
Installeer NumPy met het volgende commando, waarbij je "numpy-<version>-<architecture>.whl" vervangt door de naam van het gedownloade NumPy wheel-bestand:
pip install numpy-<version>-<architecture>.whl
Als je bijvoorbeeld NumPy versie 1.20.3 voor een 64-bits Windows-systeem hebt gedownload, zou het commando zijn:
pip install numpy-1.20.3-cp39-cp39-win_amd64.whl
Nadat de installatie is voltooid, kun je controleren of NumPy is geïnstalleerd door een Python-interpreter te openen en het volgende commando uit te voeren:
import numpy
Als er geen foutmeldingen zijn, is NumPy geïnstalleerd en klaar voor gebruik!

Installeren met de Anaconda Python-distributie

Om NumPy te krijgen kun je ook de Anaconda Python-distributie downloaden. Dit is eenvoudig en laat je snel starten! Als je deze nog niet hebt gedownload, ga dan naar de officiële pagina om hem te halen. Volg de instructies om te installeren en je kunt aan de slag!

Vraag je je af waarom dit makkelijker zou zijn?

Het fijne aan deze Python-distributie is dat je je niet te veel zorgen hoeft te maken over het apart installeren van NumPy of een van de grote pakketten die je gaat gebruiken voor je data-analyses, zoals pandas, scikit-learn, enzovoort.

Want vooral als je heel nieuw bent met Python, programmeren of terminals, kan het een opluchting zijn dat Anaconda al 100 van de populairste Python-, R- en Scala-pakketten voor data science bevat. Maar ook voor meer ervaren data scientists is Anaconda de manier om snel te beginnen met het aanpakken van data science-problemen.

Daarnaast bevat Anaconda ook verschillende open-source ontwikkelomgevingen, zoals Jupyter en Spyder. Als je na deze tutorial met Jupyter Notebook aan de slag wilt, ga dan naar onze Jupyter-notebook-tutorial.

Kortom, overweeg om Anaconda te downloaden om aan de slag te gaan met numpy en andere pakketten die relevant zijn voor data science!

Hoe maak je NumPy-arrays

Nu je je omgeving hebt ingericht, is het tijd voor het echte werk. Toegegeven, je hebt hierboven al wat met arrays gespeeld. Maar je hebt er nog niet echt hands-on mee geoefend omdat je eerst NumPy op je eigen pc moest installeren. Nu je dat hebt gedaan, is het tijd om te zien wat je moet doen om de bovenstaande codeblokken zelf uit te voeren.

Om een numpy-array te maken, kun je gewoon de functie np.array() gebruiken. Alles wat je hoeft te doen, is er een lijst aan doorgeven en optioneel kun je ook het datatype van de data specificeren. Als je meer wilt weten over de mogelijke datatypes die je kunt kiezen, ga dan naar deze gids of neem een korte blik op DataCamp’s NumPy-cheat sheet.

Je hoeft deze NumPy-datatypes niet te gaan memoriseren als je een nieuwe gebruiker bent, maar je moet wel weten en opletten met welke data je werkt. De datatypes zijn er wanneer je meer controle nodig hebt over hoe je data in het geheugen en op schijf wordt opgeslagen. Vooral als je met veel data werkt, is het goed dat je weet hoe je het opslagtype beheerst.

Vergeet niet dat je, om met de functie np.array() te werken, ervoor moet zorgen dat de numpy-bibliotheek in je omgeving aanwezig is.

De NumPy-bibliotheek volgt een importconventie: wanneer je deze bibliotheek importeert, zorg er dan voor dat je haar importeert als np. Zo zorg je ervoor dat andere Pythonistas je code makkelijker begrijpen.

In het volgende voorbeeld maak je de array my_array waar je hierboven al mee hebt gewerkt:

import numpy as np

# Make the array `my_array`
my_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Print `my_array`
print(my_array)

Als je meer wilt weten over hoe je lijsten maakt, bekijk dan onze Python-lijstenvragen-tutorial.

Soms weet je echter niet welke data je in je array wilt stoppen, of wil je data in een numpy-array importeren uit een andere bron. In die gevallen maak je respectievelijk gebruik van initiële placeholders of functies om data uit tekst in arrays te laden.

De volgende secties laten je zien hoe je dit doet.

Hoe maak je een “lege” NumPy-array

Wat mensen vaak bedoelen als ze zeggen dat ze “lege” arrays maken, is dat ze initiële placeholders willen gebruiken die je achteraf kunt vullen. Je kunt arrays initialiseren met enen of nullen, maar je kunt ook arrays maken die gevuld worden met gelijkmatig verdeelde waarden, constante of willekeurige waarden.

Toch kun je ook een volledig lege array maken.

Gelukkig zijn er best veel functies om dit te doen.

Probeer het hieronder allemaal uit!

import numpy as np

# Create an array of ones
ones_array = np.ones((3, 4))
print("Ones Array:")
print(ones_array)
print()

# Create an array of zeros
zeros_array = np.zeros((2, 3, 4), dtype=np.int16)
print("Zeros Array:")
print(zeros_array)
print()

# Create an array with random values
random_array = np.random.random((2, 2))
print("Random Array:")
print(random_array)
print()

# Create an empty array
empty_array = np.empty((3, 2))
print("Empty Array:")
print(empty_array)
print()

# Create a full array
full_array = np.full((2, 2), 7)
print("Full Array:")
print(full_array)
print()

# Create an array of evenly-spaced values
arange_array = np.arange(10, 25, 5)
print("Arange Array:")
print(arange_array)
print()

# Create an array of evenly-spaced values
np.linspace(0,2,9)

Tip: speel met de bovenstaande functies zodat je begrijpt hoe ze werken!

  • Voor sommige, zoals np.ones(), np.random.random(), np.empty(), np.full() of np.zeros(), is het enige wat je hoeft te doen om arrays met enen of nullen te maken, de shape van de array doorgeven die je wilt maken. Als optie bij np.ones() en np.zeros() kun je ook het datatype specificeren. In het geval van np.full() moet je ook de constante waarde opgeven die je in de array wilt zetten.
  • Met np.linspace() en np.arange() kun je arrays met gelijkmatig verdeelde waarden maken. Het verschil tussen deze twee functies is dat de laatste waarde van de drie die hierboven worden doorgegeven ofwel de stapgrootte aanduidt voor np.linspace() of een aantal samples voor np.arange(). Wat er in het eerste geval gebeurt, is dat je bijvoorbeeld een array van 9 waarden wilt die tussen 0 en 2 liggen. Voor de tweede geef je aan dat je een array wilt die bij 10 begint en met stappen van 5 waarden voor de array genereert die je maakt.

Onthoud dat NumPy je ook laat een identiteitsarray of -matrix maken met np.eye() en np.identity(). Een identiteitsmatrix is een vierkante matrix waarvan alle elementen op de hoofddiagonaal enen zijn en alle andere elementen nullen. Als je een matrix vermenigvuldigt met een identiteitsmatrix, blijft de gegeven matrix onveranderd.

Met andere woorden, als je een matrix vermenigvuldigt met een identiteitsmatrix, is het resultaat volgens de standaardconventies van matrixvermenigvuldiging weer dezelfde matrix.

Hoewel de focus van deze tutorial niet ligt op het demonstreren van hoe identiteitsmatrices werken, is het genoeg om te zeggen dat identiteitsmatrices nuttig zijn wanneer je met matrixberekeningen begint: ze kunnen wiskundige vergelijkingen vereenvoudigen, wat je berekeningen efficiënter en robuuster maakt.

Hoe laad je NumPy-arrays uit tekst

Arrays maken met behulp van initiële placeholders of met wat voorbeelddata is een uitstekende manier om met numpy te beginnen. Maar als je met data-analyse aan de slag wilt, zul je data uit tekstbestanden moeten laden.

Met wat je tot nu toe hebt gezien, kom je niet heel ver. Maak gebruik van specifieke functies om data uit je bestanden te laden, zoals loadtxt() of genfromtxt().

Stel dat je de volgende tekstbestanden met data hebt; je zou de becommentarieerde waarden in de onderstaande code kopiëren en plakken, ze plakken in het tekstbestand en opslaan als “data.txt”. Je kunt dan de onderstaande code gebruiken:

# This is your data in the text file
# Value1  Value2  Value3
# 0.2536  0.1008  0.3857
# 0.4839  0.4536  0.3561
# 0.1292  0.6875  0.5929
# 0.1781  0.3049  0.8928
# 0.6253  0.3486  0.8791

# Import your data
x, y, z = np.loadtxt('data.txt',
                    skiprows=1,
                    unpack=True)

In de bovenstaande code gebruik je loadtxt() om de data in je omgeving te laden. Je ziet dat het eerste argument dat beide functies nemen het tekstbestand data.txt is. Vervolgens zijn er enkele specifieke argumenten: in de eerste instructie sla je de eerste rij over en geef je de kolommen terug als aparte arrays met unpack=TRUE. Dit betekent dat de waarden in kolom Value1 in x worden gezet, enzovoort.

Let op dat er, als je kommagescheiden data hebt of als je het datatype wilt specificeren, ook de argumenten delimiter en dtype zijn die je aan de loadtxt()-argumenten kunt toevoegen.

Dat is gemakkelijk en rechttoe rechtaan, toch?

Laten we naar je tweede databestand kijken:

# Your data in the text file
# Value1  Value2  Value3
# 0.4839  0.4536  0.3561
# 0.1292  0.6875  MISSING
# 0.1781  0.3049  0.8928
# MISSING 0.5801  0.2038
# 0.5993  0.4357  0.7410

my_array2 = np.genfromtxt('data2.txt',
                      skip_header=1,
                      filling_values=-999)

Je ziet dat je hier kiest voor genfromtxt() om de data te laden. In dit geval moet je omgaan met enkele missende waarden die worden aangegeven door de strings 'MISSING'.

Aangezien de genfromtxt()-functie tekenreeksen in numerieke kolommen omzet naar nan, kun je deze waarden omzetten naar andere waarden door het argument filling_values te specificeren. In dit geval kies je ervoor om de waarde van deze missende waarden op -999 te zetten.

Als je toevallig waarden hebt die niet naar nan worden geconverteerd door genfromtxt(), is er altijd nog het argument missing_values waarmee je precies kunt aangeven wat de missende waarden van je data zijn.

Maar dat is nog niet alles.

Tip: bekijk deze numpy.genfromtxt-pagina om te zien welke andere argumenten je kunt toevoegen om je data succesvol te importeren.

Je vraagt je nu misschien af wat het verschil tussen deze twee functies precies is.

De voorbeelden gaven dit misschien impliciet aan, maar in het algemeen geeft genfromtxt() je net wat meer flexibiliteit; Het is robuuster dan loadtxt().

Laten we dit verschil wat praktischer maken: de laatste, loadtxt(), werkt alleen wanneer elke rij in het tekstbestand hetzelfde aantal waarden heeft, dus als je eenvoudig met missende waarden wilt omgaan, zul je het meestal makkelijker vinden om genfromtxt() te gebruiken.

Maar dit is zeker niet de enige reden.

Een korte blik op het aantal argumenten dat genfromtxt() biedt, leert je dat er nog veel meer zaken zijn die je kunt specificeren in je import, zoals het maximale aantal rijen om te lezen of de optie om automatisch witruimtes uit variabelen te strippen.

Hoe sla je NumPy-arrays op

Als je alles hebt gedaan wat je met je arrays wilde doen, kun je ze ook naar een bestand opslaan. Als je de array naar een tekstbestand wilt opslaan, kun je hiervoor de functie savetxt() gebruiken:

import numpy as np
x = np.arange(0.0,5.0,1.0)
np.savetxt('test.out', x, delimiter=',')

Onthoud dat np.arange() een NumPy-array met gelijkmatig verdeelde waarden maakt. De derde waarde die je aan deze functie doorgeeft, is de stapgrootte.

Er zijn natuurlijk ook andere manieren om je NumPy-arrays naar tekstbestanden op te slaan. Bekijk de functies in de onderstaande tabel als je je data naar binaire bestanden of archieven wilt wegschrijven:

save() Sla een array op naar een binair bestand in NumPy-.npy-formaat
savez() Sla meerdere arrays op in een ongecomprimeerd .npz-archief
savez_compressed() Sla meerdere arrays op in een gecomprimeerd .npz-archief

Voor meer informatie of voorbeelden van hoe je de bovenstaande functies kunt gebruiken om je data op te slaan, bekijk deze NumPy-referentiepagina of maak gebruik van een van de helpfuncties die NumPy biedt om direct meer te weten te komen!

Weet je niet zeker wat die NumPy-helpfuncties zijn?

Geen zorgen! Je leert er meer over in een van de volgende secties!

Hoe inspecteer je je NumPy-arrays

Naast de arrayattributen die hierboven zijn genoemd, namelijk data, shape, dtype en strides, zijn er nog enkele die je kunt gebruiken om eenvoudig meer over je arrays te weten te komen. De attributen die je misschien interessant vindt als je net begint, zijn de volgende:

import numpy as np

# Create a numpy array with shape (2,4) and dtype int64
my_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Print the number of dimensions of `my_array`
print("Number of dimensions of my_array:")
print(my_array.ndim)
print()

# Print the number of elements in `my_array`
print("Number of elements in my_array:")
print(my_array.size)
print()

# Print information about the memory layout of `my_array`
print("Information about the memory layout of my_array:")
print(my_array.flags)
print()

# Print the length of one array element in bytes
print("Length of one array element in bytes:")
print(my_array.itemsize)
print()

# Print the total consumed bytes by `my_array`'s elements
print("Total consumed bytes by my_array's elements:")
print(my_array.nbytes)
print()

Dit zijn bijna alle attributen die een array kan hebben.

Maak je geen zorgen als je niet het gevoel hebt dat ze allemaal nuttig voor je zijn op dit moment. Dat is vrij normaal, want zoals je in de vorige sectie hebt gelezen, ga je je pas zorgen maken over geheugen wanneer je met grote datasets werkt.

Let ook op dat je, naast de attributen, ook nog andere manieren hebt om meer informatie te verkrijgen en zelfs je array lichtjes aan te passen:

import numpy as np
my_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Print the length of `my_array`
print(len(my_array))

# Change the data type of `my_array`
my_array.astype(float)

Nu je je array hebt gemaakt, ofwel door er zelf een te maken met np.array() of een van de initiële placeholderfuncties, of door je data in te laden via de functies loadtxt() of genfromtxt(), is het tijd om dieper in te gaan op het tweede kernelement dat de NumPy-bibliotheek echt definieert: wetenschappelijk rekenen.

Hoe NumPy-broadcasting werkt

Voordat je dieper in wetenschappelijk rekenen duikt, is het misschien een goed idee om eerst te bespreken wat broadcasting precies is: het is een mechanisme dat NumPy in staat stelt om met arrays van verschillende vormen te werken wanneer je rekenkundige bewerkingen uitvoert.

De infographic hieronder laat een voorbeeld zien van NumPy-broadcasting in actie: 

NumPy Broadcasting

Bron

Praktischer gezegd heb je vaak een array die wat groter is en een andere die iets kleiner is. Idealiter wil je de kleinere array meerdere keren gebruiken om een bewerking (zoals optellen, vermenigvuldigen, enz.) uit te voeren op de grotere array.

Om dit te doen gebruik je het broadcasting-mechanisme.

Er zijn echter enkele regels als je het wilt gebruiken. En voordat je al zucht: je zult zien dat deze “regels” heel simpel en vrij logisch zijn!

  • Allereerst, om ervoor te zorgen dat broadcasting slaagt, moeten de dimensies van je arrays compatibel zijn. Twee dimensies zijn compatibel wanneer ze gelijk zijn. Bekijk het volgende voorbeeld:
# Import the NumPy library and give it an alias of `np`
import numpy as np

# Initialize a 3x4 array of ones and assign it to the variable `x`
x = np.ones((3,4))

# Print the shape of the array `x`
print("Shape of x:", x.shape)

# Initialize a 3x4 array of random numbers between 0 and 1 and assign it to the variable `y`
y = np.random.random((3,4))

# Print the shape of the array `y`
print("Shape of y:", y.shape)

# Add the arrays `x` and `y` element-wise and print the resulting array
z = x + y
print("Result of x + y:\n", z)

# Print the shape of the resulting array
print("Shape of x + y:", z.shape)
  • Twee dimensies zijn ook compatibel wanneer een van beide 1 is:
# Import the NumPy library and give it an alias of `np`
import numpy as np

# Initialize a 3x4 array of ones and assign it to the variable `x`
x = np.ones((3,4))

# Print the shape of the array `x`
print("Shape of x:", x.shape)

# Initialize a 3x4 array of random numbers between 0 and 1 and assign it to the variable `y`
y = np.random.random((3,4))

# Print the shape of the array `y`
print("Shape of y:", y.shape)

# Add the arrays `x` and `y` element-wise and print the resulting array
z = x + y
print("Result of x + y:\n", z)

# Print the shape of the resulting array
print("Shape of x + y:", z.shape)

Let op dat als de dimensies niet compatibel zijn, je een ValueError krijgt.

Tip: test ook wat de omvang van de resulterende array is nadat je de berekeningen hebt gedaan! Je zult zien dat de grootte eigenlijk de maximale grootte is langs elke dimensie van de invoerarrays.

Met andere woorden, je ziet dat het resultaat van x-y een array geeft met shape (3,4): y had een shape van (4,) en x had een shape van (3,4). De maximale grootte langs elke dimensie van x en y wordt genomen om de vorm van de nieuwe, resulterende array te vormen.

  • Tot slot kunnen arrays alleen samen worden gebroadcast als ze in alle dimensies compatibel zijn. Bekijk het volgende voorbeeld:
# Import `numpy` as `np`
import numpy as np

# Initialize `x` and `y`
x = np.ones((3,4))
y = np.random.random((5,1,4))

# Add `x` and `y`
z = x + y

Je ziet dat, hoewel x en y ogenschijnlijk andere dimensies hebben, de twee toch bij elkaar kunnen worden opgeteld.

Dat komt omdat ze in alle dimensies compatibel zijn:

  • Array x heeft dimensies 3 × 4,
  • Array y heeft dimensies 5 × 1 × 4

Aangezien je hierboven hebt gezien dat dimensies ook compatibel zijn als er één gelijk is aan 1, zie je dat deze twee arrays inderdaad een goede kandidaat zijn voor broadcasting!

Wat je zult opmerken is dat in de dimensie waar y grootte 1 heeft en de andere array een grootte groter dan 1 (namelijk 3), de eerste array zich gedraagt alsof hij langs die dimensie gekopieerd is.

Let op dat de vorm van de resulterende array opnieuw de maximale grootte langs elke dimensie van x en y is: de dimensie van het resultaat zal (5,3,4) zijn

Kortom, als je gebruik wilt maken van broadcasting, leun je sterk op de shape en dimensies van de arrays waarmee je werkt.

Maar wat als de dimensies niet compatibel zijn?

Wat als ze niet gelijk zijn of als geen van beide gelijk is aan 1?

Dan moet je dit oplossen door je array te manipuleren! Je ziet in een van de volgende secties hoe je dit doet.

Hoe werkt wiskunde met arrays?

Je hebt gezien dat broadcasting handig is bij rekenkundige operaties. In deze sectie ontdek je enkele functies die je kunt gebruiken om wiskunde met arrays te doen.

Het zal je dan ook waarschijnlijk niet verbazen dat je gewoon +, -, *, / of % kunt gebruiken om respectievelijk twee (of meer) arrays op te tellen, af te trekken, te vermenigvuldigen, te delen of de rest te berekenen. Een groot deel van waarom NumPy zo handig is, is echter dat het ook functies heeft om dit te doen. De equivalente functies van de operaties die je net zag zijn respectievelijk np.add(), np.subtract(), np.multiply(), np.divide() en np.remainder().

Je kunt ook eenvoudig machtsverheffing en worteltrekken doen op je arrays met np.exp() en np.sqrt(), of de sinussen of cosinussen van je array berekenen met np.sin() en np.cos(). Tot slot is het ook nuttig om te vermelden dat er een manier is om de natuurlijke logaritme te berekenen met np.log() of het inwendig product te berekenen door dot() op je array toe te passen.

Probeer alles uit in de onderstaande code.

Tip: bekijk eerst even de arrays die voor deze oefening zijn ingeladen!

# Import `numpy` as `np`
import numpy as np
x = np.array([[1, 2, 3], [3, 4, 5]])
y = np.array([6,7,8])

# Add `x` and `y`
z = np.add(x,y)
print("Addition of x and y:\n", z)

# Subtract `x` and `y`
z = np.subtract(x,y)
print("Subtraction of y from x:\n", z)

# Multiply `x` and `y`
z = np.multiply(x,y)
print("Element-wise multiplication of x and y:\n", z)

Weet je nog hoe broadcasting werkt? Bekijk de dimensies en de vormen van zowel x als y in je IPython-shell. Worden de regels van broadcasting gerespecteerd?

Maar er is meer.

Bekijk deze kleine lijst met aggregatiefuncties:

a.sum() Array-brede som
a.min() Array-brede minimumwaarde
b.max(axis=0) Maximale waarde van een rij van een array
b.cumsum(axis=1) Cumulatieve som van de elementen
a.mean() Gemiddelde
b.median() Mediaan
a.corrcoef() Correlatiecoëfficiënt
np.std(b) Standaarddeviatie

Naast al deze functies is het handig om te weten dat er mechanismen zijn waarmee je array-elementen kunt vergelijken. Als je bijvoorbeeld wilt controleren of de elementen van twee arrays hetzelfde zijn, kun je de operator == gebruiken. Om te controleren of array-elementen kleiner of groter zijn, gebruik je de operators < of >.

Dit lijkt allemaal vrij eenvoudig, toch?

Je kunt echter ook hele arrays met elkaar vergelijken! In dat geval gebruik je de functie np.array_equal(). Geef gewoon de twee arrays door die je met elkaar wilt vergelijken, en je bent klaar.

Let op dat je, naast vergelijken, ook logische operaties op je arrays kunt uitvoeren. Je kunt beginnen met np.logical_or(), np.logical_not() en np.logical_and(). Dit werkt in feite zoals je typische OF-, NIET- en EN-logische operaties;

In het eenvoudigste voorbeeld gebruik je OF om te zien of je elementen hetzelfde zijn (bijvoorbeeld 1), of dat een van de twee array-elementen 1 is. Als beide 0 zijn, krijg je FALSE terug. Je zou EN gebruiken om te zien of je tweede element ook 1 is en NIET om te zien of het tweede element verschilt van 1.

Test dit in het onderstaande codeblok:

# Import `numpy` as `np`
import numpy as np
# Initialize arrays
a = np.array([1, 1, 0, 0], dtype=bool)
b = np.array([1, 0, 1, 0], dtype=bool)

# `a` AND `b` 
np.logical_and(a, b)

# `a` OR `b`
np.logical_or(a, b)

# `a` NOT `b`
np.logical_not(a,b)

Hoe subsets, slices en indexering op arrays werken

Naast wiskundige bewerkingen wil je misschien ook slechts een deel van de oorspronkelijke array (of de resulterende array) of alleen bepaalde array-elementen gebruiken voor verdere analyse of andere operaties. In dat geval moet je je arrays subselecteren, slicen en/of indexeren.

Deze bewerkingen lijken sterk op wanneer je ze uitvoert op Python-lijsten. Als je de gelijkenissen zelf wilt bekijken, of als je een uitgebreidere uitleg wilt, kun je de Python-lijstentutorial van DataCamp bekijken.

Als je geen idee hebt hoe deze bewerkingen werken, is het voor nu voldoende om twee basisdingen te weten:

  • Je gebruikt vierkante haken [] als indexoperator, en
  • Over het algemeen geef je integers door aan deze vierkante haken, maar je kunt er ook een dubbele punt : of een combinatie van de dubbele punt met integers in zetten om de elementen/rijen/kolommen aan te duiden die je wilt selecteren.

Subsetting

Afgezien van deze twee punten is de makkelijkste manier om te zien hoe dit alles samenkomt door te kijken naar enkele voorbeelden van subsetting:

import numpy as np

# Initialize 1D array
my_array = np.array([1,2,3,4])

# Print subsets
print(my_array[1])
import numpy as np

# Initialize 2D array
my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Print subsets
print(my_2d_array[1][2])
print(my_2d_array[1,2])
import numpy as np

# Initialize 3D array
my_3d_array = np.array([[[1,2,3,4], [5,6,7,8]], [[1,2,3,4], [9,10,11,12]]], dtype=np.int64)

# Print subset
print(my_3d_array[1,1,2])

Slicing

Wat iets geavanceerder is dan subsetting, is slicing. Hierbij kijk je niet alleen naar specifieke waarden van je arrays, maar ga je naar het niveau van rijen en kolommen. Je werkt in feite met “regio’s” van data in plaats van pure “locaties”.

Je kunt zien wat hiermee wordt bedoeld in deze codevoorbeelden:

import numpy as np

# Initialize 1D array
my_array = np.array([1,2,3,4])

# Print subsets
print(my_array[0:2])
import numpy as np

# Initialize 2D array
my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Print subsets
print(my_2d_array[0:2,1])
import numpy as np

# Initialize 3D array
my_3d_array = np.array([[[1,2,3,4], [5,6,7,8]], [[1,2,3,4], [9,10,11,12]]], dtype=np.int64)

# Print subset
print(my_3d_array[1,...])

Je ziet dat in essentie het volgende geldt:

a[start:end] # items start through the end (but the end is not included!)
a[start:]    # items start through the rest of the array
a[:end]      # items from the beginning through the end (but the end is not included!)

In de bovenstaande code wordt elke array afzonderlijk geïnitialiseerd en worden subsets in aparte codeblokken geprint. De my_array, my_2d_array en my_3d_array zijn respectievelijk de 1D-, 2D- en 3D-arrays, en subsets worden geprint met behulp van de indexeringsnotatie.

In het eerste voorbeeld gebruiken we slicing om de items op index 0 en 1 van my_array te selecteren. In het tweede voorbeeld gebruiken we slicing om de items op rij 0 en 1, kolom 1 van my_2d_array te selecteren. In het derde voorbeeld gebruiken we de ...-notatie om alle elementen langs de eerste en tweede dimensie te selecteren, en het tweede element langs de derde dimensie van my_3d_array.

Indexeren

Tot slot is er ook indexeren. Bij NumPy gaat het om booleaanse indexering en geavanceerde of “fancy” indexering.

(Voor het geval je je afvraagt: dit is echt NumPy-jargon, ik heb de laatste niet verzonnen!)

Eerst is er booleaanse indexering. Hierbij selecteer je, in plaats van op basis van indexnummer elementen, rijen of kolommen te kiezen, die waarden uit je array die aan een bepaalde voorwaarde voldoen.

Dit in code gieten kan vrij eenvoudig zijn:

import numpy as np
my_array = np.array([1,2,3,4])
my_3d_array = np.array([[[1,2,3,4], [5,6,7,8]], [[1,2,3,4], [9,10,11,12]]], dtype=np.int64)

# Try out a simple example
print(my_array[my_array<2])

# Specify a condition
bigger_than_3 = (my_3d_array >= 3)

# Use the condition to index our 3d array
print(my_3d_array[bigger_than_3])

Let op dat je om een voorwaarde te specificeren ook gebruik kunt maken van de logische operatoren | (OF) en & (EN). Als je de voorwaarde hierboven op die manier zou willen herschrijven (wat inefficiënt is, maar ik laat het hier zien voor educatieve doeleinden :)), dan zou je bigger_than_3 = (my_3d_array > 3) | (my_3d_array == 3) krijgen.

Met de arrays die zijn ingeladen zijn er niet heel veel mogelijkheden, maar met arrays die bijvoorbeeld namen of hoofdsteden bevatten, zijn de mogelijkheden eindeloos!

Bij fancy indexering doe je in wezen het volgende: je geeft een lijst of een array van integers door om de volgorde van de subset van rijen te specificeren die je uit de originele array wilt selecteren.

Klinkt dit een beetje abstract?

Geen zorgen, probeer het gewoon in het onderstaande codeblok:

import numpy as np
my_array = np.array([1,2,3,4])
my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)
my_3d_array = np.array([[[1,2,3,4], [5,6,7,8]], [[1,2,3,4], [9,10,11,12]]], dtype=np.int64)

# Select elements at (1,0), (0,1), (1,2) and (0,0)
print(my_2d_array[[1, 0, 1, 0],[0, 1, 2, 0]])

# Select a subset of the rows and columns
print(my_2d_array[[1, 0, 1, 0]][:,[0,1,2,0]])

De tweede instructie lijkt je misschien op het eerste gezicht minder logisch. Dat is normaal. Het wordt duidelijker als je het opsplitst:

    • Als je alleen my_2d_array[[1,0,1,0]] uitvoert, is het resultaat het volgende:
array([[5, 6, 7, 8],
   [1, 2, 3, 4],
   [5, 6, 7, 8],
   [1, 2, 3, 4]])
    • Wat het tweede deel, namelijk [:,[0,1,2,0]], je vertelt is dat je alle rijen van dit resultaat wilt behouden, maar dat je de volgorde van de kolommen een beetje wilt veranderen. Je wilt de kolommen 0, 1 en 2 weergeven zoals ze nu zijn, maar je wilt kolom 0 herhalen als laatste kolom in plaats van kolom nummer 3 weer te geven. Dit geeft je het volgende resultaat:
array([[5, 6, 7, 5],
   [1, 2, 3, 1],
   [5, 6, 7, 5],
   [1, 2, 3, 1]])

Geavanceerde indexering kent duidelijk geen geheimen meer voor je!

Hoe vraag je om hulp

Als kort intermezzo moet je weten dat je altijd om meer informatie kunt vragen over de modules, functies of klassen waarmee je werkt, vooral omdatNumPy best veel kan zijn wanneer je er voor het eerst mee begint.

Om hulp vragen is vrij eenvoudig.

Je maakt gewoon gebruik van de specifieke helpfuncties die numpy biedt om je op weg te helpen:

  • Gebruik lookfor() om op sleutelwoorden in docstrings te zoeken. Dit is vooral handig als je net begint, omdat de ‘theorie’ erachter kan vervagen in je geheugen. Het enige nadeel is dat je alle zoekresultaten moet doorlopen als je zoekopdracht niet zo specifiek is, zoals in het onderstaande codevoorbeeld. Dat kan het zelfs minder overzichtelijk maken.
  • Gebruik info() voor snelle uitleg en codevoorbeelden van functies, klassen of modules. Als je een doener bent, is dit de way to go! Het enige nadeel van deze functie is waarschijnlijk dat je je bewust moet zijn van de module waarin bepaalde attributen of functies zitten. Als je niet meteen weet wat daarmee bedoeld wordt, bekijk dan het onderstaande codevoorbeeld.

Je ziet, beide functies hebben hun voor- en nadelen, maar je zult zelf zien waarom beide nuttig kunnen zijn: probeer ze in het onderstaande codeblok!

import numpy as np

# Look up info on `mean` with `np.lookfor()` 
print(np.lookfor("mean"))
# Get info on data types with `np.info()`
np.info(np.ndarray.dtype)

Let op dat je inderdaad moet weten dat dtype een attribuut van ndarray is. Zorg er ook voor dat je niet vergeet om np voor de modules, klassen of termen te zetten waarover je informatie vraagt, anders krijg je een foutmelding als deze:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'ndarray' is not defined

Je weet nu hoe je om hulp kunt vragen, en dat is een goed ding. Het volgende onderwerp dat deze NumPy-tutorial behandelt, is arraymanipulatie.

Niet dat je dit onderwerp niet zelf aankunt, integendeel!

Maar sommige functies kunnen vragen oproepen, want wat is het verschil tussen resizen en reshapen?

En wat is het verschil tussen je arrays horizontaal en verticaal stapelen?

De volgende sectie beantwoordt deze vragen, maar als je ooit twijfelt, gebruik dan gerust de helpfuncties die je zojuist hebt gezien om snel bijgepraat te worden.

Hoe manipuleer je arrays

Rekenkundige bewerkingen uitvoeren op je arrays is één van de dingen die je zult doen, maar waarschijnlijk nog belangrijker om dit en broadcasting te laten werken is weten hoe je je arrays manipuleert.

Hieronder staan enkele van de meest voorkomende bewerkingen die je gaat doen.

Hoe transposeer je je arrays

Wat transposeeren van je arrays eigenlijk doet, is de dimensies ervan permuteren. Of, anders gezegd, je draait de shape van de array om. Laten we een klein voorbeeld nemen om het effect van transponeren te laten zien:

import numpy as np
my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Print `my_2d_array`
print(my_2d_array)

# Transpose `my_2d_array`
print(np.transpose(my_2d_array))

# Or use `T` to transpose `my_2d_array`
print(my_2d_array.T)

Tip: als de visuele vergelijking tussen de array en de getransponeerde versie niet helemaal duidelijk is, inspecteer dan de shape van de twee arrays om zeker te weten dat je begrijpt waarom de dimensies zijn verwisseld.

Let op dat er twee transposeerfuncties zijn. Beide doen hetzelfde; Er is niet veel verschil. Je moet wel rekening houden met het feit dat T meer een handige snelkoppeling is en dat je veel meer flexibiliteit hebt met np.transpose(). Daarom wordt aanbevolen om die functie te gebruiken als je meer argumenten wilt.

Alles is prima wanneer je arrays met meer dan één dimensie transponeert, maar wat gebeurt er als je alleen een 1D-array hebt? Denk je dat er een effect is?

Probeer het zelf in het onderstaande codeblok. Je 1D-array is al ingeladen:

import numpy as np
my_array = np.array([1,2,3,4])

# Print `my_2d_array
print(my_array)

# Transpose `my_2d_array
print(np.transpose(my_array))

# Or use `T` to transpose `my_2d_array
print(my_array.T)

Je hebt helemaal gelijk! Er is geen effect wanneer je een 1D-array transponeert!

Reshapen versus resizen van je arrays

Je hebt in de broadcasting-sectie misschien gelezen dat de dimensies van je arrays compatibel moeten zijn als je ze geschikte kandidaten voor rekenkundige operaties wilt maken. Maar de vraag wat je moet doen als dat niet het geval is, was nog niet beantwoord.

Welnu, hier krijg je het antwoord!

Wat je kunt doen als de arrays niet dezelfde dimensies hebben, is je array resizen. Je krijgt dan een nieuwe array terug die de shape heeft die je aan de functie np.resize() hebt doorgegeven. Als je je originele array doorgeeft samen met de nieuwe dimensies, en als die nieuwe array groter is dan die je oorspronkelijk had, wordt de nieuwe array gevuld met kopieën van de originele array die zo vaak worden herhaald als nodig is.

Als je echter gewoon np.resize() op de array toepast en je geeft de nieuwe shape door, wordt de nieuwe array gevuld met nullen.

Laten we dit proberen met een voorbeeld:

import numpy as np
x = np.ones((3,4))

# Print the shape of `x`
print(x.shape)

# Resize `x` to ((6,4))
np.resize(x, (6,4))

# Try out this as well
x.resize((6,4))

# Print out `x`
print(x)

Naast resizen kun je je array ook reshapen. Dit betekent dat je een nieuwe vorm aan een array geeft zonder de data te veranderen. De sleutel tot reshapen is ervoor zorgen dat de totale grootte van de nieuwe array ongewijzigd blijft. Als je het voorbeeld neemt van array x dat hierboven werd gebruikt, met een grootte van 3 × 4 of 12, moet je ervoor zorgen dat de nieuwe array ook een grootte van 12 heeft.

Psst… Als je de grootte van een array met code wilt berekenen, gebruik dan het size-attribuut: x.size of x.reshape((2,6)).size:

import numpy as np

# Initialize array with shape (3,4) containing all ones
x = np.ones((3,4))

# Print the shape of `x`
print("Shape of x:", x.shape)

# Resize `x` to ((6,4))
np.resize(x, (6,4))

# Try out this as well
x.resize((6,4))

# Print out `x` before and after resizing
print("Array before transposing:\n", x)
print("Shape of array before transposing:", x.shape)

# Transpose `x`
x = x.T

# Print out `x` after transposing
print("Array after transposing:\n", x)
print("Shape of array after transposing:", x.shape)

Output: 

Shape of x: (3, 4)
Array before transposing:
 [[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
Shape of array before transposing: (6, 4)
Array after transposing:
 [[1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]]
Shape of array after transposing: (4, 6)

Als niets anders werkt, kun je ook een array aan je oorspronkelijke array toevoegen of array-elementen invoegen of verwijderen om ervoor te zorgen dat je dimensies passen bij de andere array die je voor je berekeningen wilt gebruiken.

Een andere bewerking die handig kan zijn wanneer je de shape van arrays verandert, is ravel(). Met deze functie kun je je arrays flatten. Dit betekent dat als je ooit 2D-, 3D- of nD-arrays hebt, je deze functie kunt gebruiken om alles plat te maken naar een 1D-array.

Best handig, toch?

Hoe voeg je arrays toe

Wanneer je arrays aan je oorspronkelijke array toevoegt, worden ze “vastgelijmd” aan het einde van die oorspronkelijke array. Als je ervoor wilt zorgen dat wat je toevoegt niet aan het einde van de array komt, kun je overwegen om het in te voegen. Ga naar de volgende sectie als je daar meer over wilt weten.

Toevoegen is vrij eenvoudig dankzij de NumPy-bibliotheek; Je kunt gewoon gebruikmaken van np.append().

Bekijk hoe het werkt in het onderstaande codeblok. Vergeet niet dat je altijd kunt controleren welke arrays zijn geladen door bijvoorbeeld my_array in de IPython-shell te typen en op ENTER te drukken.

import numpy as np

my_array = np.array([1,2,3,4])

# Print `my_array` before appending
print("my_array before appending:", my_array)

# Append a 1D array to `my_array`
new_array = np.append(my_array, [7, 8, 9, 10])

# Print `new_array`
print("new_array:", new_array)

# Print `my_array` after appending
print("my_array after appending:", my_array)

Output:

my_array before appending: [1 2 3 4]
new_array: [ 1  2  3  4  7  8  9 10]
my_array after appending: [1 2 3 4]

Let op dat my_array ongewijzigd blijft na het toevoegen omdat np.append() een nieuwe array retourneert in plaats van de oorspronkelijke array in-place te wijzigen.

Toevoegen aan my_2d_array:

import numpy as np

my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Print `my_2d_array` before appending
print("my_2d_array before appending:\n", my_2d_array)

# Append an extra column to `my_2d_array`
new_2d_array = np.append(my_2d_array, [[7], [8]], axis=1)

# Print `new_2d_array`
print("new_2d_array:\n", new_2d_array)

# Print `my_2d_array` after appending
print("my_2d_array after appending:\n", my_2d_array)

Output: 

my_2d_array before appending:
 [[1 2 3 4]
  [5 6 7 8]]
new_2d_array:
 [[1 2 3 4 7]
  [5 6 7 8 8]]
my_2d_array after appending:
 [[1 2 3 4]
  [5 6 7 8]]


Let erop dat wanneer je een extra kolom aan my_2d_array toevoegt, de as is gespecificeerd. Onthoud dat as 1 de kolommen aangeeft, terwijl as 0 de rijen aangeeft in 2D-arrays.

Hoe voeg je array-elementen in en verwijder je ze

Naast toevoegen kun je ook array-elementen invoegen en verwijderen. Zoals je misschien al raadt, zijn de functies die je hiervoor gebruikt np.insert() en np.delete():

import numpy as np
my_array = np.array([1,2,3,4])
my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Insert `5` at index 1
np.insert(my_array, 1, 5)

# Delete the value at index 1
np.delete(my_array,[1])

Hoe voeg je arrays samen en splits je ze

Je kunt je arrays ook ‘mergen’ of samenvoegen. Er zijn allerlei functies die je daarvoor kunt gebruiken en de meeste staan hieronder vermeld.

Probeer ze uit, maar test ook in de IPython-shell wat de shape van de arrays is. De arrays die zijn geladen zijn x, my_array, my_resized_array en my_2d_array.

import numpy as np 
x = np.ones((4,))
my_array = np.array([1,2,3,4])
my_resized_array=np.resize(my_array,(2,4))
my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)

# Concatentate `my_array` and `x`
print(np.concatenate((my_array,x)))

# Stack arrays row-wise
print(np.vstack((my_array, my_2d_array)))

# Stack arrays row-wise
print(np.r_[my_resized_array, my_2d_array])

# Stack arrays horizontally
print(np.hstack((my_resized_array, my_2d_array)))

# Stack arrays column-wise
print(np.column_stack((my_resized_array, my_2d_array)))

# Stack arrays column-wise
print(np.c_[my_resized_array, my_2d_array])

Je zult een paar dingen opmerken terwijl je de functies doorloopt:

  • Het aantal dimensies moet hetzelfde zijn als je twee arrays wilt concatenaten met np.concatenate(). Als je dus een array met my_array wilt samenvoegen, die 1D is, moet je ervoor zorgen dat de tweede array die je hebt ook 1D is.
  • Met np.vstack() combineer je moeiteloos my_array met my_2d_array. Je hoeft er alleen voor te zorgen dat, omdat je de arrays rij-gewijs stapelt, het aantal kolommen in beide arrays gelijk is. Je zou dus ook een array met shape (2,4) of (3,4) aan my_2d_array kunnen toevoegen, zolang het aantal kolommen maar overeenkomt. Anders gezegd: de arrays moeten dezelfde shape hebben langs alle assen behalve de eerste. Hetzelfde geldt wanneer je np.r[] wilt gebruiken.
  • Voor np.hstack() moet je ervoor zorgen dat het aantal dimensies hetzelfde is en dat het aantal rijen in beide arrays gelijk is. Dat betekent dat je arrays zoals (2,3) of (2,4) kunt stapelen met my_2d_array, dat zelf een shape van (2,4) heeft. Alles is mogelijk zolang je ervoor zorgt dat het aantal rijen overeenkomt. Deze functie wordt nog steeds ondersteund door NumPy, maar je zou de voorkeur moeten geven aan np.concatenate() of np.stack().
  • Met np.column_stack() moet je ervoor zorgen dat de arrays die je invoert dezelfde eerste dimensie hebben. In dit geval zijn beide shapes hetzelfde, maar als my_resized_array (2,1) of (2,) zou zijn, zouden de arrays nog steeds worden gestapeld.
  • np.c_[] is een andere manier om te concatenaten. Ook hier moet de eerste dimensie van beide arrays overeenkomen.

Wanneer je arrays hebt samengevoegd, wil je ze op een gegeven moment misschien ook splitsen. Net zoals je ze horizontaal kunt stapelen, kun je dat ook doen maar dan verticaal. Je gebruikt respectievelijk np.hsplit() en np.vsplit():

import numpy as np
my_array = np.array([1,2,3,4])
my_resized_array=np.resize(my_array,(2,4))
my_2d_array = np.array([[1,2,3,4], [5,6,7,8]], dtype=np.int64)
my_stacked_array = np.hstack((my_resized_array, my_2d_array))

# Split `my_stacked_array` horizontally at the 2nd index
print(np.hsplit(my_stacked_array, 2))

# Split `my_stacked_array` vertically at the 2nd index
print(np.vsplit(my_stacked_array, 2))

Wat je in gedachten moet houden wanneer je deze splitfuncties gebruikt, is waarschijnlijk de shape van je array. Neem het bovenstaande geval als voorbeeld: my_stacked_array heeft een shape van (2,8). Als je de index wilt selecteren waarop de splitsing moet plaatsvinden, moet je de shape in gedachten houden.

Hoe visualiseer je NumPy-arrays

Tot slot is het zeker handig om te weten hoe je je arrays kunt plotten. Dit is vooral handig bij data-exploratie, maar ook in latere fasen van de data science-workflow, wanneer je je arrays wilt visualiseren.

Met np.histogram()

In tegenstelling tot wat de functie lijkt te suggereren, tekent de functie np.histogram() de histogram niet, maar berekent hij de voorkomens van de array die in elke bin vallen; Dit bepaalt de oppervlakte die elke balk van je histogram inneemt.

Wat je dan aan de functie np.histogram() doorgeeft, is eerst de inputdata of de array waarmee je werkt. De array wordt afgevlakt wanneer het histogram wordt berekend.

# Import `numpy` as `np`
import numpy as np

# Initialize your array
my_3d_array = np.array([[[1,2,3,4], [5,6,7,8]], [[1,2,3,4], [9,10,11,12]]], dtype=np.int64)

# Pass the array to `np.histogram()`
print(np.histogram(my_3d_array))

# Specify the number of bins
print(np.histogram(my_3d_array, bins=range(0,13)))

Je ziet dat als resultaat het histogram wordt berekend: de eerste array geeft de frequenties weer voor alle elementen van je array, terwijl de tweede array de bins weergeeft die zouden worden gebruikt als je geen bins specificeert.

Als je wel een aantal bins specificeert, zal het resultaat van de berekening anders zijn: de floats zijn weg en je ziet alleen gehele getallen voor de bins.

Er zijn nog andere argumenten die je kunt specificeren die het berekende histogram kunnen beïnvloeden. Je vindt ze allemaal hier.

Maar wat is het nut van het berekenen van zo’n histogram als je het niet kunt visualiseren?

Visualiseren is een fluitje van een cent met behulp van Matplotlib, maar je hebt np.histogram() niet nodig om het histogram te berekenen. plt.hist() doet dit zelf wanneer je de (afgevlakte) data en de bins doorgeeft:

# Import numpy and matplotlib
import numpy as np
import matplotlib.pyplot as plt

# Construct the histogram with a flattened 3d array and a range of bins
plt.hist(my_3d_array.ravel(), bins=range(0,13))

# Add a title to the plot
plt.title('Frequency of My 3D Array Elements')

# Show the plot
plt.show()

De bovenstaande code geeft je vervolgens het volgende (basis)histogram:

Numpy Array Histogram

np.meshgrid() gebruiken

Een andere manier om je array (indirect) te visualiseren is door np.meshgrid() te gebruiken. Het probleem waar je met arrays tegenaan loopt, is dat je 2D-arrays van x- en y-coördinaten nodig hebt. Met de bovenstaande functie kun je uit een array van x-waarden en een array van y-waarden een rechthoekig grid maken: de functie np.meshgrid() neemt twee 1D-arrays en produceert twee 2D-matrices die overeenkomen met alle paren (x, y) in de twee arrays. Vervolgens kun je deze matrices gebruiken om allerlei soorten plots te maken.

np.meshgrid() is vooral handig als je functies op een grid wilt evalueren, zoals de onderstaande code laat zien:

# Import NumPy and Matplotlib
import numpy as np
import matplotlib.pyplot as plt

# Create an array
points = np.arange(-5, 5, 0.01)

# Make a meshgrid
xs, ys = np.meshgrid(points, points)
z = np.sqrt(xs ** 2 + ys ** 2)

# Display the image on the axes
plt.imshow(z, cmap=plt.cm.gray)

# Draw a color bar
plt.colorbar()

# Show the plot
plt.show()

De bovenstaande code geeft het volgende resultaat:

Numpy Meshgrid

Verder dan data-analyse met NumPy

Gefeliciteerd, je bent aan het einde van de NumPy-tutorial gekomen!

Je hebt veel behandeld, dus zorg er nu voor dat je de opgedane kennis vasthoudt. Vergeet niet je kopie van DataCamp’s NumPy-cheat sheet te pakken om je daarbij te ondersteunen!

Na al deze theorie is het ook tijd om meer te oefenen met de concepten en technieken die je in deze tutorial hebt geleerd. Een manier om dit te doen is om terug te gaan naar de scikit-learn-tutorial en verder te experimenteren met de data-arrays die worden gebruikt om machine learning-modellen te bouwen.

Als dit niet jouw ding is, controleer dan opnieuw of je Anaconda hebt gedownload. Ga daarna aan de slag met NumPy-arrays in Jupyter met deze Definitieve gids voor Jupyter Notebook. Zorg er ook voor dat je deze Jupyter Notebook bekijkt, die je ook door data-analyse in Python met NumPy en enkele andere bibliotheken leidt in de interactieve data science-omgeving van Jupyter Notebook.

Overweeg ten slotte om de DataCamp-cursussen over datamanipulatie en visualisatie te bekijken. Vooral onze nieuwste cursussen in samenwerking met Continuum Analytics zullen je zeker interesseren! Bekijk de cursussen Manipulating DataFrames with Pandas of Pandas Foundations.

Onderwerpen
Python
Data Science
Data-analyse

Leer meer over Python

Cursus

Introductie tot NumPy

4 uur
62.6K
Word een expert in NumPy door te leren hoe je arrays kunt maken, sorteren, filteren en bijwerken met behulp van de boomtelling van NYC.
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