Indeksiranje z maskami

Imejmo tabelo

import numpy as np

a = np.array([5, 8, 3, 1, 10, 5])

Pripravimo "masko": tabelo, ki je enako dolga kot a in vsebuje bool-e.

m = np.array([True, True, True, False, False, True])

Z masko m lahko izbiramo elemente a, tako da uporabimo m kot indeks.

a[m]
array([5, 8, 3, 5])

To nam vrne tiste elemente a-ja, pri katerih je istoležni element m-ja enak True.

To je zelo koristna reč. Tako lahko, recimo, dobimo vse elemente a, ki so večji od 5. Pripravimo primerno masko

m = a > 5
    
m
array([False,  True, False, False,  True, False])

in jo uporabimo:

a[m]
array([ 8, 10])

To seveda navadno naredimo brez posebne spremenljivke, napišemo lahko kar:

a[a > 5]
array([ 8, 10])

Maske z večdimenzionalnimi tabelami

Recimo, da imamo

a = np.array([[5, 8, 7, 1, 3],
              [2, 5, 1, 1, 4],
              [7, 6, 1, 9, 2]])

Kako bi dobili vse vrstice tabele, ki v stolpcu 1 vsebujejo število manjše od 7?

Zanima nas drugi stolpec (in to vse vrstice tega stolpca), torej

a[:, 1]
array([8, 5, 6])

Konkretno, vedeti hočemo, ali je tam število, ki je manjše od 7.

a[:, 1] < 7
array([False,  True,  True])

In to bomo uporabili za izbor vrstic:

a[a[:, 1] < 7]
array([[2, 5, 1, 1, 4],
       [7, 6, 1, 9, 2]])

Nekaj podobnega boste delali ob reševanju naloge.

Tu pa si oglejmo še nekaj malo bolj zapletenega. Hočemo vrstice, katerih vsota je večja od 20. Vsote vrstic dobimo z

np.sum(a, axis=1)
array([24, 13, 25])

Zanimajo nas vsote, večje od 20, torej

np.sum(a, axis=1) > 20
array([ True, False,  True])

Vidimo, prva in tretja vrstica. Torej

a[np.sum(a, axis=1) > 20]
array([[5, 8, 7, 1, 3],
       [7, 6, 1, 9, 2]])

Kaj pa stolpci, katerih vsota je večja od deset?

a[:, np.sum(a, axis=0) > 10]
array([[5, 8, 1],
       [2, 5, 1],
       [7, 6, 9]])

Ne spreglejte: np.sum(a, axis=1) je potrebno uporabiti kot drugi indeks. Prvi indeks pa je :, saj želimo vse vrstice; izbir(č)ni smo le glede stolpcev.

Naloga

Zdaj znamo dovolj, da učinkovito rešimo še drugi del tretje naloge Binary Diagnostic. Tu žal ne bo šlo tako, da bi računali za vse stolpce hkrati. Potrebno bo narediti zanko, s katero bomo šli prek stolpcev in izbirali vrstice, ki ustrezajo kriteriju, dokler ne ostane ena sama vrstica.