Skip navigation

Numpy mátrixok feltételes indexelése

Használati mód

A Numpy lehetőséget biztosít arra, hogy a mátrix indexelésekor egy, az indexelendő mátrixszal megegyező számú sorból és oszlopból logikai bool típusú mátrixot használjunk. A Numpy művelet csak azokra az elemekre hajtódik végre, amelyekre az indexelő bool mátrix megfelelő eleme True értékű.

Tekintsük a következő példát:

nparr = np.array([0, 1, 2, 3, 4, 5], dtype=np.uint8)
print(nparr)
nparr_cond = np.array([False, True, False, False, True, False], dtype=bool)
print(nparr_cond)
nparr[nparr_cond] = 255
print(nparr)

A futás eredményeként az alábbi kiírást kapjuk:

[0 1 2 3 4 5]
[False  True False False  True False]
[  0 255   2   3 255   5]

Azokon a helyeken, ahol a logikai index True, ott megváltozik az érték 255-re, ahol False, ott nem.

Logikai értékű mátrixot nem csak manuálisan készíthetünk, hanem Numpy logikai művelettel is. Például:

nparr = np.array([0, 1, 2, 3, 4, 5], dtype=np.uint8)
nparr_cond2 = nparr > 2
nparr[nparr_cond2] = 255
print(nparr)

Azokon a helyeken lesz a nparr_cond2 index True, ahol az nparr mátrix értéke nagyobb 2-nél. Ezt használva az nparr mátrix indexelésre, ezeken a helyeken lesz 255 az nparr értéke ([ 0 1 2 255 255 255]).

A feltétel definíciót és az indexelést össze is vonhatjuk:

nparr[nparr > 2] = 255

Az index kifejezésben logikai mátrixok között további logikai műveleteket is definiálhatunk. Például az alábbi példa egy mátrix ([0 1 2 3 4 5]) 2-nél nagyobb egyenlő, de 4-nél kisebb egyenlő értékeit állítja 255 értékre ([ 0 1 255 255 255 5]):

nparr = np.array([0, 1, 2, 3, 4, 5], dtype=np.uint8)
nparr[(nparr >= 2) & (nparr <= 4)] = 255
print(nparr)

A kifejezés jobb oldalán nem csak konstans szerepelhet, hanem megfelelő méretű tömb/mátrix is. Például két egyforma méretű tömb/mátrix esetén mindkettőre alkalmazhatjuk ugyanazt a logikai indexelést:

nparr = np.array([0, 1, 2, 3, 4, 5], dtype=np.uint8)
nparr2 = np.array([100, 101, 102, 103, 104, 105], dtype=np.uint8)
nparr_cond = np.array([False, True, False, False, True, False], dtype=bool)

nparr[nparr_cond] = nparr2[nparr_cond]
print(nparr)

Az eredmény [ 0 101 2 3 104 5], vagyis az nparr tömb a logikai igaz helyeken felveszi az nparr2 tömb ugyanezen helyeken szereplő értékeit. A jobb oldalon önmagában az nparr2 szerepeltetése indexelési hibát okozna, mert a bal és jobb oldalon egyforma méretű adatnak kell szerepelnie.

Vegyes indexelés

Figyeljük meg, hogy a Numpy mátrix indexelésekor az alábbi lehetőségeink vannak:

  • Konkrét koordináták megadásával egy képpont elérése. Pl.: pixel = img[100, 100].
  • Megadhatunk koordinátánként külön intervallumot. Pl.: crop = img[80:100, 100, :2]. Ezzel összefüggő sor, oszlop és csatorna tartományokat érhetünk el.
  • A feltételes indexeléssel megadhatjuk, hogy mely sor, oszlop, és/vagy csatornákat szeretnénk indexelni. Mint fentebb láttuk.

Ezeket az indexelési módokat vegyesen használhatjuk.

  • Az indexelésre használt bool mátrix kisebb dimenziójú is lehet, mint az indexelendő mátrix.
  • Ekkor a kimaradó dimenziók minden eleme figyelembe vételre kerül, vagy megadhatunk konkrét, intervallumos, vagy akár másik bool mátrixos indexelést is. Ennek részleteivel most nem foglalkozunk.