Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

NumPy โ€” Indexatie, slicing en boolean indexing

Met indexatie en slicing selecteer je elementen of deelgebieden van een array. Boolean indexing laat je elementen filteren op basis van een conditie โ€” dit is รฉรฉn van de krachtigste en meest gebruikte technieken in NumPy รฉn Pandas.

โš ๏ธ We behandelen ook het cruciale verschil tussen een view en een copy โ€” een bron van subtiele bugs.

Indexatie in 1Dยถ

10
50
40

Slicing in 1Dยถ

Syntax: array[start:stop:step] โ€” stop is exclusief.

[2 3 4]
[0 1 2 3]
[6 7 8 9]
[0 2 4 6 8]
[9 8 7 6 5 4 3 2 1 0]

Indexatie en slicing in 2Dยถ

In 2D gebruik je kommaโ€™s: array[row, column].

1
12
[5 6 7 8]
[ 3  7 11]
[[2 3]
 [6 7]]

โš ๏ธ View vs. copyยถ

Dit is รฉรฉn van de meest voorkomende bronnen van verborgen bugs in NumPy.

Een slice geeft een view terug โ€” een venster op de originele data. Aanpassen van de view wijzigt de originele array!

Gebruik .copy() wanneer je een onafhankelijke kopie wilt.

original: [ 1 99  3  4  5]
original:  [1 2 3 4 5]
copy_arr:  [99  3  4]
is view: True
is view: False

Boolean indexingยถ

Met boolean indexing filteer je elementen van een array via een masker van True/False-waarden. Dit is de basis van data-filtering in NumPy en Pandas.

mask: [False  True False  True False  True  True False]
high scores: [82 91 78 88]
[82 91 78 88]
[82 67 78 88]
[45 91 88 39]
[1 0 3 0 5 0]

NaN-waarden detecteren en behandelenยถ

NaN (Not a Number) is de standaard manier om ontbrekende waarden voor te stellen in NumPy.

NaN mask: [False  True False  True False False]
Number of NaNs: 2
Valid values: [1.5 3.2 4.8 2.1]
Mean: 2.9

Fancy indexingยถ

Met fancy indexing selecteer je elementen via een lijst van indices. In tegenstelling tot slicing geeft dit altijd een copy.

['Alice' 'Charlie' 'Eve']
['Charlie' 'Eve' 'Alice' 'Diana' 'Bob']

Oefeningenยถ

Oefening 1 โ€” Gegeven:

M = np.arange(1, 26).reshape(5, 5)

Selecteer (zonder de array te wijzigen):

  • De derde rij (index 2)

  • De laatste kolom

  • De submatrix bestaande uit rijen 1โ€“3 en kolommen 2โ€“4

[[ 1  2  3  4  5]
 [ 6  7  8  9 10]
 [11 12 13 14 15]
 [16 17 18 19 20]
 [21 22 23 24 25]]

Oefening 2 โ€” Demonstreer het view-vs-copy-probleem:

  1. Maak een array original = np.array([10, 20, 30, 40, 50])

  2. Maak een slice part = original[1:4] en pas part[0] = 99 toe

  3. Druk original af โ€” wat zie je?

  4. Herhaal met .copy() en vergelijk

Oefening 3 โ€” Gegeven temperatures = np.array([22.1, -5.3, 18.4, 0.0, -12.7, 30.1, 15.6, -0.5]):

  • Selecteer alle temperaturen boven 15ยฐC

  • Selecteer alle temperaturen tussen -10ยฐC en 10ยฐC

  • Tel het aantal temperaturen beneden 0ยฐC

Oefening 4 โ€” Gegeven data = np.array([3.1, np.nan, 7.4, np.nan, 2.8, np.nan, 9.1, 4.5]):

  • Tel het aantal NaN-waarden

  • Bereken het gemiddelde van de geldige waarden (zonder de NaNโ€™s)

  • Vervang de NaNโ€™s door het gemiddelde van de geldige waarden (maak eerst een copy!)

Oefening 5 โ€” Gegeven twee arrays:

names = np.array(["Alice", "Bob", "Charlie", "Diana", "Eve"])
scores = np.array([88, 74, 95, 82, 91])

Selecteer de namen van studenten met een score > 85, gesorteerd van hoog naar laag.